我不使用javascript,所以我不熟悉回调和响应。我使用谷歌地图来绘制点A和点X,Y,Z之间的距离。问题是,我想使用javascript来确定哪个点X,Y,Z最接近A,并且它们映射出它们之间的方向。
我的代码正在运行。我可以找出所有3个目的地的最短距离,但我仍然坚持这种愚蠢的目的。
你知道,Google使用异步回调向浏览器提供数据,如果我运行for循环来逐个检查所有3个目的地,我得到的结果不正确。
以下是代码:
var maxDistance = 99999999999;
var destn;
for (var i = 0; i < locations.length; i++) {
var thisDistance = 0;
var start = origin;
var end = locations[i];
var request = {
origin: start,
destination: end,
travelMode: google.maps.DirectionsTravelMode.DRIVING
};
directionsService.route(request, function(response, status) {
if (status == google.maps.DirectionsStatus.OK) {
thisDistance = response.routes[0].legs[0].distance.value;
if (thisDistance < maxDistance) {
destn = response.routes[0].legs[0].end_address;
maxDistance = thisDistance;
}
} else {
document.getElementById("addressNotFound").style.display = 'block';
}
});
}
calcShortestRoute(origin, destn);
很明显,当我调用此函数时,destn的值会因为循环结束而谷歌处理程序尚未收到数据而未定义。如果我再次调用函数1,我会得到从前一个回调中收到的destn值(之前给出了undefined)。
有人请告诉我如何解决这个问题。
答案 0 :(得分:4)
退出for循环时,destn
中没有值,因为从directionsService.route()
收到结果后,它会异步设置 。相反,您需要跟踪已返回的请求数,并在收到所有响应后从响应回调中调用您的函数:
... // your code
var responseCount = 0;
for (var i = 0; i < locations.length; i++) {
... // your code
directionsService.route(request, function(response, status) {
... // your code
if (++responseCount == locations.length) {
calcShortestRoute(origin, destn);
}
});
}
编辑:我重新阅读了您的问题,并认为我更了解您的代码正在做什么。这个答案应该更准确(引导更简洁!)。
答案 1 :(得分:4)
您需要等到返回所有三个Google回复。一个简单的解决方案是:将距离计算函数调用移动到最后的匿名函数,然后仅在所有响应都已返回时计算距离:
// global count variable
var callbackCount = 0;
for (var i = 0; i<locations.length; i++) {
var thisDistance=0;
var start = origin;
var end = locations[i];
var request = {
origin:start,
destination:end,
travelMode: google.maps.DirectionsTravelMode.DRIVING
};
directionsService.route(request, function(response, status) {
if (status == google.maps.DirectionsStatus.OK) {
thisDistance = response.routes[0].legs[0].distance.value;
if (thisDistance < maxDistance) {
destn = response.routes[0].legs[0].end_address;
maxDistance = thisDistance;
}
}
else {
document.getElementById("addressNotFound").style.display = 'block';
}
// move this to here, and pass in number of locations
calcShortestRoute(origin, destn, locations.length);
});
}
然后calcShortestRoute看起来像:
function calcShortestRoute(origin, destn, locationCount) {
// increment callback count
callbackCount++;
if (callbackCount == locationCount) { // all responses have returned
// do your distance checking
....
}
}