循环javascript节点中的异步函数
我需要扫描行程数组,计算当前行程与数组中每次行程之间的行程时间,并选择最短的行程。对于计算,我需要发送谷歌地图api调用 我对异步回调函数感到非常困惑。 有人能帮我解决这个问题吗?如何在for循环中发送api调用,检查结果并继续 多谢各位 行程在我的数组列表中 数组: JS:循环javascript节点中的异步函数,javascript,json,node.js,google-maps,httprequest,Javascript,Json,Node.js,Google Maps,Httprequest,我需要扫描行程数组,计算当前行程与数组中每次行程之间的行程时间,并选择最短的行程。对于计算,我需要发送谷歌地图api调用 我对异步回调函数感到非常困惑。 有人能帮我解决这个问题吗?如何在for循环中发送api调用,检查结果并继续 多谢各位 行程在我的数组列表中 数组: JS: 无法在循环中检查结果。循环是在过去,回调发生在未来-你不能改变这一点。你只能做两件事,一件是对另一件的抽象: 1您可以以这样的方式创建回调:当所有结果都存在时,回调将收集结果并进行比较 你可以用承诺做同样的事情 在适当修改
无法在循环中检查结果。循环是在过去,回调发生在未来-你不能改变这一点。你只能做两件事,一件是对另一件的抽象: 1您可以以这样的方式创建回调:当所有结果都存在时,回调将收集结果并进行比较 你可以用承诺做同样的事情 在适当修改代码中的cb调用时,1方法看起来像这样:
var results = [];
function cb(index, ttltimereturnoffice) {
results.push([index, ttltimereturnoffice]);
if (results.length == array.length) {
// we have all the results; find the best one, display, do whatever
}
}
我不太清楚您使用的是什么库,以及它是否支持承诺,但是如果http.get返回承诺,您可以通过将承诺收集到一个数组中来执行2,然后使用promise库的all或when或类似功能在all上附加回调即可。如果我想使用数组中的元素并将其发送给api,然后检查第一个api响应,然后决定是否发送另一个api和数组中的下一个元素,我不能这样做?@ChloéLinHe你可以这样做,但这需要将请求链接到回调。函数cb{iftest{doAnotherQuery}},doAnotherQuery有cb回调。哦,对不起,我没有从你的问题中理解这一点。你当然可以做到;但在这种情况下,不能使用循环。我将在稍后草拟一个答案。编辑:@bcdan说得对。@bcdan谢谢,那么当我认为已经完成了内部循环中的api调用时,如何停止并返回到外部循环?@amadan谢谢。我正在努力学习如何使用承诺。但这很令人困惑。你能举例说明如何在循环中使用promise吗?我正在使用nodejs,我认为它支持promises,否则我可以使用promiseAPI或q库
function assigntrips(array){
var triplist = [];
for(var i=0; i< array.length; i++){
var fstnode = array[i];
for(var j=i+1; j<array.length; j++){
//here i want to get the response from google api and decide if i want to choose the trip.
if not the for loop continues and send another api call.
}
}
}
function apicall(inputi, cb){
var destination_lat = 40.689648;
var destination_long = -73.981440;
var origin_lat = array[inputi].des_lat;
var origin_long = array[inputi].des_long;
var departure_time = 'now';
var options = {
host: 'maps.googleapis.com',
path: '/maps/api/distancematrix/json?origins='+ origin_lat +','+origin_long+ '&destinations=' + office_lat + ',' + office_long + '&mode=TRANSIT&departure_time=1399399424&language=en-US&sensor=false'
}
http.get(options).on('response',function(response){
var data = '';
response.on('data',function(chunk){
data += chunk;
});
response.on('end',function(){
var json = JSON.parse(data);
console.log(json);
var ttltimereturnoffice = json.rows[0].elements[0].duration.text;
//var node = new Node(array[i],null, triptime,0,ttltimereturnoffice,false);
//tripbylvtime.push(node);
cb(ttltimereturnoffice + '\t' + inputi);
});
});
}
var results = [];
function cb(index, ttltimereturnoffice) {
results.push([index, ttltimereturnoffice]);
if (results.length == array.length) {
// we have all the results; find the best one, display, do whatever
}
}