以同步方式执行异步进程|Node.js|Google Maps



此问题与以前在异步进程上发布的问题不同。我正在使用一个类似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.waterfallasync.series可以在此处执行此操作。您可以在回调函数中使用它们来实现同步行为。

最新更新