将异步功能的行为更改为同步

时间:2018-08-07 11:32:58

标签: node.js mongodb google-maps promise

我具有在同一文件中获取路线信息的功能:-

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

控制台打印每次呼叫的距离,但不返回值。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

兑现诺言。以及使用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