【问题标题】:Change Behaviour of asynchronous function to synchronous将异步函数的行为更改为同步
【发布时间】:2019-01-14 11:37:10
【问题描述】:

我有一个功能可以在同一个文件中获取路线信息:-

sanGetDirections : function(origin,dest){
        gm.directions({
            origin: origin,
            destination: dest
        }, function(err, data) {
            assert.ifError(err);
            if (data.routes[0] && data.routes[0].legs) {
                 console.log(data.routes[0].legs[ 0 ].distance.text)
                 return data.routes[0].legs[ 0 ].distance.text;
            }               
        })
    }

我想循环调用这个函数:-

var distance = module.exports.sanGetDirections(veh_data[key].lat+','+veh_data[key].lng,lat+','+lng);

控制台打印每次调用的距离但不返回值。我如何才能同步实现这一目标?

【问题讨论】:

    标签: node.js mongodb google-maps promise


    【解决方案1】:

    让它成为一个承诺。并使用async/await

    sanGetDirections: function (origin, dest) {
        return new Promise((res, rej) => {
            gm.directions({
                origin: origin,
                destination: dest
            }, function (err, data) {
                if(err) rej(err);
                if (data.routes[0] && data.routes[0].legs) {
                    console.log(data.routes[0].legs[0].distance.text)
                    res(data.routes[0].legs[0].distance.text)
                }
                rej('some error');
            })
        });
    }
    

    您也可以使用utils.promisify 来使函数成为一个承诺。现在您可以在async 函数中使用它。

    const func = async () => {
        for(let i=0;i<5;i++){
            try{
                const data = await module.exports.sanGetDirections(origin, dest);
            }catch(err){
                // do something with err
                console.log(err);
            }
        }
    }
    

    参考这里:https://javascript.info/async-await#await

    【讨论】:

    • 我可以这样使用它吗:-try{ const data = await module.exports.sanGetDirections(origin, dest); }catch(err){ // 用 err 做一些事情 console.log(err); }
    • 可以,但您需要在 async 函数中使用它。添加异步等待函数参考文档
    • 值即将到来,但介于两者之间会出现此错误:- (node:16063) UnhandledPromiseRejectionWarning: Unhandled PromiseRejectionWarning: Unhandled Promise Rejection (rejection id: 107): some error
    • 我有这个功能如何添加异步和等待作为参考? sanGetAssigningDetails : function(req, res,addr,ids,vehh_data,dates, callback){})
    • 只是模仿我在你的其他功能中所做的
    猜你喜欢
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 2012-07-25
    相关资源
    最近更新 更多