播种javascript回调

播种javascript回调,javascript,google-maps-api-3,Javascript,Google Maps Api 3,我有一张谷歌地图,上面有大约200个标记。使用谷歌距离矩阵服务,我可以找到从一个地址到地图上所有标记的行车距离。由于API的限制,每次调用我只能提交25个目的地,因此我必须将操作分解为8个单独的对距离矩阵服务的调用 我的问题是,由于调用是异步的,它们可以以任何顺序返回,因此我有点困惑于如何将返回的结果与原始标记数组进行最佳匹配。理想情况下,我希望向回调函数传递一个偏移量,以便它确切地知道原始标记数组中的哪些25个元素对应于从API调用返回的25个结果,但我不知道如何实现这一点,因此非常感谢您的帮

我有一张谷歌地图,上面有大约200个标记。使用谷歌距离矩阵服务,我可以找到从一个地址到地图上所有标记的行车距离。由于API的限制,每次调用我只能提交25个目的地,因此我必须将操作分解为8个单独的对距离矩阵服务的调用

我的问题是,由于调用是异步的,它们可以以任何顺序返回,因此我有点困惑于如何将返回的结果与原始标记数组进行最佳匹配。理想情况下,我希望向回调函数传递一个偏移量,以便它确切地知道原始标记数组中的哪些25个元素对应于从API调用返回的25个结果,但我不知道如何实现这一点,因此非常感谢您的帮助

var limit = 25;
var numMarkers = markers.length; // markers is an array of markers defined elsewhere
var numCallbacks = Math.ceil(numMarkers/limit);
var callbackCount = 0;

for(var i = 0; i < numMarkers; i += limit) {
    var destinations = [];

    // Get destination position in batches of 25 (API limit)
    for(var j = i; j < i + limit && j < numMarkers; j++) {
        destinations[j - i] = markers[j].getPosition();
    }

    // Calculate distances
    distMatrix.getDistanceMatrix(
    {
        origins: origin, // array containing single lat/lng
        destinations: destinations,
        travelMode: google.maps.TravelMode.DRIVING,
        unitSystem: google.maps.UnitSystem.IMPERIAL,
        avoidHighways: false,
        avoidTolls: false

    }, function(response, status) {

        if (status == google.maps.DistanceMatrixStatus.OK) {
            var distances = response.rows[0].elements;

            // This is where it would be nice to know the offset in the markers array 
            // that these 25 results correspond to so I can then just iterate through 
            // the distances array and add the data to the correct marker.
        }

        if(++callbackCount == numCallbacks) {
            // All callbacks complete do something else...
        }
    });
}
var限值=25;
var numMarkers=markers.length;//标记是在别处定义的标记数组
var numCallbacks=Math.ceil(numMarkers/limit);
var callbackCount=0;
对于(变量i=0;i
因此,如果有一种方法可以在调用时使用for循环中的“i”值为每个API调用的回调函数植入种子,那么很容易匹配所有内容,但我对javascript不是很在行,所以我不知道如何做,或者是否可能


谢谢你们的帮助

我假设您尝试在回调中使用
I
j
,但总是发现它们等于最后一个值;这是因为JavaScript只有函数作用域(而不是块),所以
i
j
只声明一次;因此,每次迭代都引用相同的变量

有关这方面的详细信息,请参阅


解决方案与示例中的相同(且所有出现的问题);您需要引入一个新的范围级别。你可以很好地解决你的问题

function buildResponseFor(i) {
    return function (response, status) {
        if (status == google.maps.DistanceMatrixStatus.OK) {
            var distances = response.rows[0].elements;

            // Use i here.
        }
    }
}
然后将
getDistanceMatrix
调用更新为:

distMatrix.getDistanceMatrix({
    origins: origin, // array containing single lat/lng
    destinations: destinations,
    travelMode: google.maps.TravelMode.DRIVING,
    unitSystem: google.maps.UnitSystem.IMPERIAL,
    avoidHighways: false,
    avoidTolls: false

}, buildResponseFor(i));

。。。注意:您可以将
i
、或
j
、或
i
j
等传递给
buildResponseFor
函数,它们将在回调函数中作为
函数
buildResponseFor
声明中的名称提供!非常感谢马特。我确实尝试过使用I和j,但正如你所说,我看到了循环中的最终值。我对javascript还相当陌生,所以感谢您的知识点滴,我相信它会再次派上用场。