以同步方式执行异步进程| Node.js |谷歌地图
此问题与以前发布在异步进程上的问题不同。我正在开发一个类似uber的应用程序,我使用firebase作为后端。我制作了一个服务器来处理一些任务,比如给司机分配订单。当订单出现时,我需要使用谷歌地图api查找所有司机和客户之间的距离。下面是我用来计算司机和客户之间距离的函数以同步方式执行异步进程| Node.js |谷歌地图,node.js,firebase,Node.js,Firebase,此问题与以前发布在异步进程上的问题不同。我正在开发一个类似uber的应用程序,我使用firebase作为后端。我制作了一个服务器来处理一些任务,比如给司机分配订单。当订单出现时,我需要使用谷歌地图api查找所有司机和客户之间的距离。下面是我用来计算司机和客户之间距离的函数 function calculatingDistance(fromLat,fromLong,toLat,toLong){ var distanceDurationObject={}; var options =
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(fromLat,fromLong,toLat,toLong)”函数,toLat和toLong具有驱动程序的纬度和经度,fromLat和fromLong具有客户的纬度和经度。在for循环之后,我执行所有回调,一旦所有回调都完成,就会调用函数x(),并将来自所有回调的distance durationObject返回到函数x()
TL;DR基本上我只想在所有异步函数完成执行后将它们的数据合并到一个函数中。您正在寻找。您可以使用库来实现所需的功能。此库具有用于同步任务的广泛功能。例如,async.falter
或async.series
可以在这里完成这项工作。
您可以在回调函数中使用它们来实现同步行为。请参见以下答案:您可以选择使用承诺和
Promise.all()
,使用异步库或编写一个简单的计数器,在完成所有异步任务后进行计数,然后调用您的函数。您不会将异步代码转换为同步代码——这在Javascript中不会发生。您将跟踪所有异步操作何时完成,收集结果,然后使用最终结果/错误调用一些回调。这里还有数百个相关问题,非常感谢!答应我,我的问题都解决了。