JavaScript - 回调 - 等待多个函数结束
JavaScript - callback - waiting for multiple functions to end
我用谷歌地图API计算从许多不同的起点到目的地的最短路径。我决定这样做:(计算每对点,而不是将结果保存到数组,然后在最后检查哪个是最好的)。但是我在回调方面有问题 - 因为正如注释所说,数组始终为零 - 因为此代码是在所有计算路由长度的请求之前执行的。
function foo(){
var directionsService = new google.maps.DirectionsService();
var destination = new google.maps.LatLng(x,y);
var arrayOfRes= [];
for(var index in originPoints){
var request = {
origin:originPoints[index].marker.position,
destination:destination,
travelMode: google.maps.TravelMode.DRIVING
};
directionsService.route(request, function(result, status) {
if (status == google.maps.DirectionsStatus.OK) {
var res = {};
res.length = result.routes[0].legs[0].distance.value;
res.index = index;
res.result = result;
arrayOfRes.push(res);
}
});
}
//here arrayOfRes.length is always 0
if(arrayOfRes.length>1)
{
var bestResult = arrayOfRes[0];
for(var i = 1; i < arrayOfRes.length; i++)
{
if(bestResult.length > arrayOfRes[i])
bestResult = arrayOfRes[i];
}
console.log("Best is" + bestResult.length);
}
else if(arrayOfRes.length ==1)
{
var bestResult = arrayOfRes[0];
}
}
如何使用回调编写函数,使其等到所有请求都结束?
像
这样的Google请求是异步的,因此您必须编写异步代码,这意味着仅处理从回调返回的数据。
在返回路由的回调函数中,您需要检查这是否是最后一个请求的答案。 如果是这样,则您的数组具有所有结果,然后您可以处理该数组。
假设originPoints
是一个数组,你可以这样做:
var arrayOfRes = [];
for (var index = 0; index < originPoints.length; ++index) {
var request = {
origin:originPoints[index].marker.position,
destination:destination,
travelMode: google.maps.TravelMode.DRIVING
};
directionsService.route(request, function(result, status) {
if (status == google.maps.DirectionsStatus.OK) {
var res = {};
res.length = result.routes[0].legs[0].distance.value;
res.index = index;
res.result = result;
arrayOfRes.push(res);
// check if all data has arrived
if (arrayOfRes.length === originPoints.length) {
// put code here to process arrayOfRes
}
}
});
}
注意:javascript 无法让您的代码等待所有请求完成然后继续 - 因此您必须使用异步编程风格,代码流从回调继续。
注意:由于directionsService.route
是异步调用,因此它将在将来的某个时候调用其回调。 同时,您的JS将继续执行。 这意味着紧跟在此代码块之后的代码将在 ajax 调用完成之前和填充arrayOfRes
之前执行。 因此,唯一可以安全使用arrayOfRes
数据的地方是在回调本身或从回调调用的函数中。
相关文章:
- 函数1结束后,JavaScript调用函数2
- JavaScript - 回调 - 等待多个函数结束
- 使用 JavaScript 显示 XML 数据,在函数结束时出现问题
- 等待函数结束(在 async.series 中)无法按预期工作
- 函数结束时如何运行代码
- Javascript等待函数结束,包括来自node.js的异步MYSQL查询
- 等待异步 Javascript 函数结束检索结果(延迟?)
- Jquery 执行函数 第三方函数结束后
- 如何在调用它的函数结束时执行回调
- 在所有cordova.exec函数结束后执行成功回调
- 在上一个js函数结束后运行js函数
- 直到函数结束,才会显示模式引导
- 函数结束后显示MessageBox
- Javascript对象在创建它的函数结束后被设置为未定义
- Node.js回调,等待函数结束
- 在函数结束时用javascript播放音乐
- Javascript在另一个异步函数结束时调用函数
- 事件.PreventDefault直到函数结束才会起作用
- 在JavaScript中,等待一个函数结束后再开始另一个函数
- 如何正确插入回调函数,使一个函数结束,然后执行另一个函数