node.js - 将异步函数的行为更改为同步
问题描述
我有一个功能可以在同一文件中获取路线信息:-
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);
}
}
}
推荐阅读
- javascript - React JS 对购物车进行分组
- python - 通过匹配多行对 Pandas Dataframe 进行排序
- firefox - 设置 Last-Modified 标头时,Firefox 总是缓存
- inno-setup - 用 Inno Setup 的 setup 子文件夹中的文件覆盖已安装的文件
- c++ - Visual Studio 2019 不强调 C++ 项目中的错误
- javascript - 搜索功能 .match() 区分大小写
- javascript - 如何使用 for 循环对用户插入的数字求和?
- python - 炸弹包括python中的有序对
- google-chrome-extension - Linux 安装上的 Chrome 扩展程序“包无效”错误
- python - poliastro epoch:如何指定非默认值?