首页 > 解决方案 > 将异步函数的行为更改为同步

问题描述

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

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.jsmongodbgoogle-mapspromise

解决方案


让它成为一个承诺。和使用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


推荐阅读