将异步函数的行为更改为同步



我有一个函数来获取同一文件中的路由信息:-

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);

控制台打印每个调用的距离,但不返回值。 我如何同步实现这一点?

做出承诺。和使用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

相关内容

  • 没有找到相关文章

最新更新