节点js在链内调用一个promise函数。

时间:2020-07-01 17:07:30

标签: node.js promise request-response

您好,我是异步调用的新手,希望您能为我提供帮助。

我有一个.then链,我想在链的中间调用一个返回promise的函数,但是我碰巧该链不等待它具有promise函数的结果,并且继续运行而没有等待中

var User = require('../models/user_model');
var mapbox = require('./helper/request_api_mapbox');

findOne_mapbox: (req, res) => {
  User.findById(req.params.id)
        .then(user => {
            
            ...
            return user.address;
        })
         .then(function (adress_to_mapbox) 
            {
                // mapbox.connect_mapbox returns a promise
                mapbox.connect_mapbox(adress_to_mapbox)
                .then(mapbox_coordinates => {
                    //inside this console.log is not read it
                    console.log("2 then mapbox_coordinates ", mapbox_coordinates)
                    return Promise.resolve(body);
                })   
                           
            })
             .then(  mapbox_coordinates  => {

                // in this console.log mapbox_coordinates returns undefined
                console.log("last promise mapbox_coordinates", 
                mapbox_coordinates)

                // I want to return mapbox_coordinates
                return res.status(200).send({
                    "response": "I only receive this string " 
                });
            })

}

promise函数为:

'use strict'

const rp = require('request-promise');
const access_token_mapbox = 'bla bla bla private';

function connect_mapbox(adress_to_mapbox) {
    return new Promise((resolve, reject) => {  
        
        var options = {
            method: 'GET',
            uri: 'https://api.mapbox.com/geocoding/v5/mapbox.places/' + adress_to_mapbox + '.json?access_token=' + access_token_mapbox,                 
            json: true // Automatically stringifies the body to JSON
        };
    
        rp(options)
        .then(body => {
            if (body.hasOwnProperty('errcode') && body.errcode != 0) {
            return Promise.reject(body);
            }
            console.log("inside connect_mapbox function on mapbox_model 2", body)
            
            return Promise.resolve(body);
        })
        .catch(err => {
            debug(err);
            return Promise.reject(err);
        })
        
    })  
}   

module.exports = { connect_mapbox };

在promise函数中,我可以在console.log中看到它使api正确调用并且响应主体正常。

1 个答案:

答案 0 :(得分:0)

我正在开始编程,尽管不知道它是否最正确,我还是通过以下方式解决了问题

我通过将connect_mapbox promise函数转换为async await并将.then链转换为async await来解决了这个问题,

'use strict'

const rp = require('request-promise');
const access_token_mapbox = 'bla bla bla private';

async function connect_mapbox(adress_to_mapbox) {

    try {

        var options = {
            method: 'GET',
            uri: 'https://api.mapbox.com/geocoding/v5/mapbox.places/' + adress_to_mapbox + '.json?access_token=' + access_token_mapbox,                 
            json: true // Automatically stringifies the body to JSON
        };

        let response = await rp(options);

        console.log("inside connect_mapbox function on mapbox_model", response)

        if (response.hasOwnProperty('errcode') && body.errcode != 0) {
            return Promise.reject(response);
        }

        return Promise.resolve(response);

    }catch(error) {
        return Promise.reject(error);
    }
}

module.exports = { connect_mapbox };

.then链像

var User = require('../models/user_model');
var mapbox = require('./helper/request_api_mapbox');

findOne_mapbox: (req, res) => {
  User.findById(req.params.id)
        .then(user => {
            
            ...
            return user.address;
        })
         .then(async function (adress_to_mapbox) 
            {
                
                console.log("adress_to_mapbox thit could be deleted", adress_to_mapbox)
                    
                let mapbox_response = await mapbox.connect_mapbox(adress_to_mapbox)
                   
                console.log("async mapbox_response", mapbox_response) 

                return res.status(200).send({
                    mapbox_response 
                });
            })
             ...

}
相关问题