gpt4 book ai didi

javascript - 播种 javascript 回调

转载 作者:行者123 更新时间:2023-11-29 10:48:11 31 4
gpt4 key购买 nike

我有一张谷歌地图,上面有大约 200 个标记。使用谷歌距离矩阵服务,我可以找到从一个地址到 map 上所有标记的行驶距离。由于 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...
}
});
}

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

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

最佳答案

我假设您已经尝试使用 ij在你的回调中,但总是发现它们等于最后一个值;这是因为 JavaScript 只有函数范围(不是 block ),所以 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));

...注意你可以通过 i , 或 j , 或 ij等到你的buildResponseFor函数,并且它们将作为您在 function 中给它们的名称在您的回调函数中使用。 buildResponseFor的声明.

关于javascript - 播种 javascript 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15462810/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com