我有一个谷歌地图,上面有大约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并不是那么好,所以我不知道如何做到这一点,或者它是否可能。
感谢您提供任何帮助!
答案 0 :(得分:3)
我假设您已尝试在回调中使用i
和j
,但始终发现它们等于最后一个值;这是因为JavaScript只有函数作用域(不是块),所以i
和j
只被声明为一次;因此每次迭代都引用相同的变量。
有关详细信息,请参阅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));
...请注意,您可以将i
,j
,i
和j
等传递给buildResponseFor
函数,他们会在您的回调函数中可以使用function
buildResponseFor
声明中提供的名称。