此问题与以前在异步进程上发布的问题不同。我正在使用一个类似uber的应用程序,并使用firebase作为后端。我做了一个服务器来处理一些任务,比如给司机分配订单。当订单出现时,我需要使用谷歌地图api查找所有司机和客户之间的距离。下面是我用来计算驾驶员和客户之间距离的函数。
function calculatingDistance(fromLat,fromLong,toLat,toLong){
var distanceDurationObject={};
var options = {
host: 'maps.googleapis.com',
path: '/maps/api/directions/json?origin='+fromLat+','+fromLong+'&destination='+toLat+','+toLong+'&key=AIzaSyBsoc1PZOItqHNYc5z2hW_ejPFi2piRR8Y',
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
};
var req = https.get(options, function(res) {
//buffering alll data
var bodyChunks = [];
res.on('data', function(chunk) {
// You can process streamed parts here...
bodyChunks.push(chunk);
}).on('end', function() {
var body = Buffer.concat(bodyChunks);
json = JSON.parse(body);
//parsing json returned
var routes =json["routes"];
var legsObject=routes[0].legs;
var legsFirstArray=legsObject[0];
//Our Required Distance between two points
var distanceValue=legsFirstArray.distance.value;
var durationValue=legsFirstArray.duration.value;
console.log(distanceValue+" "+durationValue);
distanceDurationObject.distance=distanceValue;
distanceDurationObject.duration=durationValue;
});
});
req.on('error', function(e) {
console.log('ERROR: ' + e.message);
//try to add this error to a file
});
}
客户和出租车司机之间的距离查找流程如下所示。
1) 一旦订单出现在数据库中,它就会被提取到服务器中,并保存在一个地图中,其中包含作为客户id的关键字和作为提供客户纬度和经度的对象的值。
2) 还有一个映射,其中包含作为驱动程序id的键和作为对象的值,其中包含驱动程序的纬度和经度。
3) 使用上面给出的函数计算客户与所有驾驶员的距离,距离最小的驾驶员会收到通知。
问题:
我想要的是,一旦订单出现,在for循环中,我在队列中添加"calculatingDistance(from Lat,from Long,to Lat,to Long)"函数,其中to Lat和to Long具有驾驶员的纬度和经度,from Lat和from Long具有客户的纬度和纬度。在for循环之后,我执行所有的回调,一旦所有这些回调完成,就会调用函数x(),并将来自所有这些回调的distance durationObject返回到函数x();
TL;DR基本上,我只想在所有异步函数完全执行后,将它们的数据合并到一个函数中。
您正在寻找Promise.all.
您可以使用异步库来实现所需的功能。这个库具有用于同步任务的广泛功能。例如,async.waterfall
或async.series
可以在此处执行此操作。您可以在回调函数中使用它们来实现同步行为。