为什么Javascript回调在FOR循环运行后触发,而它在FOR循环中?
我有一个谷歌距离矩阵在工作,但需要考虑超过25个目的地,所以我将我的数组分为多个部分,一次发送25个目的地。它在某种程度上是有效的,但我不明白的是FOR、函数和回调的工作顺序。回调日志都发生在FOR循环完成之后,但它们实际上包含正确的数据,我不明白为什么 这使得我无法检查for循环的完成情况,因为回调不会发生,所以我无法访问从Google作为响应回退的对象构建的数组 假设xx从0开始,目标[]是lat/long的工作列表 这些是控制台中的输出(不是变量): 这就是问题中的代码块:为什么Javascript回调在FOR循环运行后触发,而它在FOR循环中?,javascript,for-loop,callback,geocode,Javascript,For Loop,Callback,Geocode,我有一个谷歌距离矩阵在工作,但需要考虑超过25个目的地,所以我将我的数组分为多个部分,一次发送25个目的地。它在某种程度上是有效的,但我不明白的是FOR、函数和回调的工作顺序。回调日志都发生在FOR循环完成之后,但它们实际上包含正确的数据,我不明白为什么 这使得我无法检查for循环的完成情况,因为回调不会发生,所以我无法访问从Google作为响应回退的对象构建的数组 假设xx从0开始,目标[]是lat/long的工作列表 这些是控制台中的输出(不是变量): 这就是问题中的代码块:
var ii,jj,tempServArr,maxZips = 25;
for (ii=0,jj=destinations.length; ii<jj; ii+=maxZips) {
tempServArr = destinations.slice(ii,ii+maxZips);
xx++;
calculateDistances(zip_latlng, tempServArr);
}
console.log("after for = ",xx);
});
});
}
function calculateDistances(origin, destinations) {
console.log("calculate = ",xx);
var service = new google.maps.DistanceMatrixService();
service.getDistanceMatrix(
{
origins: [origin],
destinations: destinations,
travelMode: google.maps.TravelMode.DRIVING,
unitSystem: google.maps.UnitSystem.METRIC,
avoidHighways: false,
avoidTolls: false
}, callback);
}
function callback(response, status) {
if (status != google.maps.DistanceMatrixStatus.OK) {
alert('Error was: ' + status);
} else {
console.log("callback = ",xx);
var origins = response.originAddresses;
var destinations = response.destinationAddresses;
for (var i = 0; i < origins.length; i++) {
varⅡ,jj,tempServArr,maxZips=25;
对于(ii=0,jj=destinations.length;ii您正在处理的异步调用可能重复。回调在收到来自服务器的响应之前不会启动,而服务器可以be@Shadowfool哪一种可能是…?@James这是因为响应返回的时间比for循环运行的时间长吗?在这种情况下,有没有办法检查fi上次运行的回调的nal响应?当然。将全局计数器设置为零。在每次回调中,递增该计数器,然后测试它是否等于数组中的项数,如果是,则执行一些最终函数。
var ii,jj,tempServArr,maxZips = 25;
for (ii=0,jj=destinations.length; ii<jj; ii+=maxZips) {
tempServArr = destinations.slice(ii,ii+maxZips);
xx++;
calculateDistances(zip_latlng, tempServArr);
}
console.log("after for = ",xx);
});
});
}
function calculateDistances(origin, destinations) {
console.log("calculate = ",xx);
var service = new google.maps.DistanceMatrixService();
service.getDistanceMatrix(
{
origins: [origin],
destinations: destinations,
travelMode: google.maps.TravelMode.DRIVING,
unitSystem: google.maps.UnitSystem.METRIC,
avoidHighways: false,
avoidTolls: false
}, callback);
}
function callback(response, status) {
if (status != google.maps.DistanceMatrixStatus.OK) {
alert('Error was: ' + status);
} else {
console.log("callback = ",xx);
var origins = response.originAddresses;
var destinations = response.destinationAddresses;
for (var i = 0; i < origins.length; i++) {