播种javascript回调

时间:2013-03-17 15:54:27

标签: javascript google-maps-api-3

我有一个谷歌地图,上面有大约200个标记。使用Google距离矩阵服务我可以找到地址到地图上所有标记的行车距离。由于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并不是那么好,所以我不知道如何做到这一点,或者它是否可能。

感谢您提供任何帮助!

1 个答案:

答案 0 :(得分:3)

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

有关详细信息,请参阅Doesn't JavaScript support closures with local variables?


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

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));

...请注意,您可以将ijij等传递给buildResponseFor函数,他们会在您的回调函数中可以使用function buildResponseFor声明中提供的名称。