为什么Javascript回调在FOR循环运行后触发,而它在FOR循环中?

为什么Javascript回调在FOR循环运行后触发,而它在FOR循环中?,javascript,for-loop,callback,geocode,Javascript,For Loop,Callback,Geocode,我有一个谷歌距离矩阵在工作,但需要考虑超过25个目的地,所以我将我的数组分为多个部分,一次发送25个目的地。它在某种程度上是有效的,但我不明白的是FOR、函数和回调的工作顺序。回调日志都发生在FOR循环完成之后,但它们实际上包含正确的数据,我不明白为什么 这使得我无法检查for循环的完成情况,因为回调不会发生,所以我无法访问从Google作为响应回退的对象构建的数组 假设xx从0开始,目标[]是lat/long的工作列表 这些是控制台中的输出(不是变量): 这就是问题中的代码块:

我有一个谷歌距离矩阵在工作,但需要考虑超过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++) {