3

我有一个谷歌地图,上面有大约 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...
        }
    });
}

因此,如果有一种方法可以在调用它时从 for 循环中为每个 API 调用的回调函数设置“i”的值,那么匹配所有内容会很容易,但我不是那么好使用 javascript,所以我不知道该怎么做,甚至不知道它是否可能。

感谢你们提供的任何帮助!

4

1 回答 1

3

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

有关这方面的更多信息,请参阅JavaScript 不支持带有局部变量的闭包吗?.


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

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, or j, or iand jetc. 传递给您的buildResponseFor函数,它们将在您的回调函数中作为您functionbuildResponseFor.

于 2013-03-17T16:06:11.967 回答