2016-07-26 92 views
1

这个问题不同于以前发布在异步进程上的问题。我正在开发一个类似于应用程序的超级应用程序,并且我正在使用Firebase作为后端。我制作了一个服务器来处理一些任务,比如给驾驶员分配命令。当出现订单时,我需要使用Google地图API找到所有司机和客户之间的距离。以下是我用来计算驾驶员和客户之间距离的功能。以同步方式执行异步进程Node.js |谷歌地图

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)一旦订单出现在数据库中,它将被提取到服务器中并保存在一个包含key的地图中,作为customer和value的id作为提供客户经度和纬度的对象。

2)还有一个地图,其中包含作为驱动程序ID和值的关键字作为包含驱动程序纬度和经度的对象。

3)使用上面给出的函数计算与所有驾驶员的客户距离,并且具有最小距离的一个驾驶员接收到通知。

问题:

我想是,一旦出现的次序,在for循环中我添加“calculatingDistance(fromLat,fromLong,toLat,toLong)”功能与toLat和toLong具有纬度和经度队列的司机以及来自拉特和龙的客户的经纬度。在for循环之后,我执行所有的回调函数,一旦所有的回调函数完成,函数x()被调用,所有回调函数的距离durationObject返回函数x();

TL; DR基本上我只是希望所有异步函数的数据在完成执行后都集成到一个函数中。

+0

看到这个答案:http://stackoverflow.com/questions/38426745/how-do-i-return-the-accumulated-results-of-multiple-parallel-asynchronous-func/38427271#38427271 – slebetman

+0

你的选择是使用Promise和'Promise.all()',使用异步库或者编写一个简单的计数器,并在所有的异步任务完成之后进行计数,然后调用你的函数。您不会将异步代码转换为同步代码 - 这在JavaScript中不会发生。您将跟踪所有异步操作何时完成,收集结果,然后用最终结果/错误调用某个回调。这里有数百个其他相关的问题。 – jfriend00

回答

1

您正在寻找Promise.all

+1

非常感谢! Promise.all解决了我的问题。 –

1

你可以使用async库来实现你所需要的。该库具有广泛的同步任务功能。例如async.waterfallasync.series可以在这里完成这项工作。 您可以在回调函数中使用它们以实现同步行为。