我正在使用Google Maps API来获取多条路线的行车距离。每条路线都由不同的司机驾驶;它们都有相同的起点但不同的终点可能有多个航路点。
我遇到的问题是API似乎没有给我任何方法来命名每条路由,所以当它们异步返回时,我无法确定哪条路由属于哪个驱动程序。确实,每条路线都有不同的地址,但DirectionsService响应对象给我的地址略有不同 - 例如,“Des Plaines,IL”变成了“Des Plaines,IL,USA” - 这使得比较不可靠那些。
API似乎不允许我使用请求对象发送任意字符串来唯一地命名它们。那我该怎么办?
可能的代码段有助于澄清我正在做的事情:
$.getJSON(ajaxsource, function(data) {
var darr = data.driver_info, // includes driver name, start and end addresses
driver, start, end,
waypts = [];
for (var i=0,j=darr.length; i<j; i++) {
if (driver==$.trim(darr[i][8])) { // same driver, next destination
// start = end;
waypts.push({
location: end,
stopover: true });
} else {
waypts = [];
driver = $.trim(darr[i][8]);
start = $.trim(darr[i][4]);
}
end = $.trim(darr[i][2]);
if (i+1==j || driver!=$.trim(darr[i+1][8])) {
var request = { // route object
origin: start,
destination: end,
waypoints: waypts,
optimizeWaypoints: true,
travelMode: google.maps.DirectionsTravelMode.DRIVING
};
directionsDisplay = new google.maps.DirectionsRenderer();
directionsService.route(request, function(response, status) {
var legs = response.routes[0].legs;
// console.log(response);
for (var k=0; k<legs.length; k++) {
$('#results').append($('<li>').html("Driver " + driver +
"<br>starts at " + legs[k].start_address +
"<br>and drives " + legs[k].distance.text +
"<br>to end at " + legs[k].end_address));
}
});
};
}; // end for
}); // end getJSON
该代码将根据需要返回所有路由信息,但由于它是异步的,因此每个结果中的driver
是我data.driver_info
数组中列出的最后一个驱动程序的名称。我需要的是列出应该与该特定路由相关联的驱动程序。
答案 0 :(得分:2)
在循环中设置var loc_driver = driver;
,以便您可以将其置于for
循环的本地,然后在回调中使用该值而不是依赖于“全局”(至少相对于到整个getJSON
调用)值。
对DirectionsService的回调包含来自for循环和整个function(data){ ... }
的范围变量。
问题在于driver
随着for循环的每次传递而变化,并且您的回调使用“全局”driver
。相反,如果你设置一个仅存在于每个for循环范围内的变量,并且回调依赖于该变量,那么问题就解决了。
编辑:可能存在一些参考和价值问题,那么如何在方便的地方宣布:
callbackFactory = function(driver) {
return function(request, status) {
var legs = response.routes[0].legs;
console.log(response);
for (var k=0; k<legs.length; k++) {
$('#results').append($('<li>').html("Driver " + driver +
"<br>starts at " + legs[k].start_address +
"<br>and drives " + legs[k].distance.text +
"<br>to end at " + legs[k].end_address));
}
};
};
然后在你的控制结构中:
directionsService.route(request, callbackFactory(driver));
答案 1 :(得分:0)
更多调试发现了一个解决方案 - Google文档没有提到response
对象不仅包含状态和路由,还有一个名为ub
的子对象镜像我发送的请求对象。使用它,我可以完全比较地址以匹配到驱动程序的路由。
Object
routes: Array[1]
status: "OK"
ub: Object
destination: "1234 Some Street, Antioch, IL"
optimizeWaypoints: true
origin: "2345 Anywhere Ave., Lake Forest, IL"
travelMode: "DRIVING"
waypoints: Array[0]
__proto__: Object
__proto__: Object
我在directionsService.route()
回调中添加了以下代码:
var driver = '',
end_ub = response.ub.destination;
for (var a=0,b=darr.length; a<b; a++) {
if (darr[a][2]==end_ub) {
driver = darr[a][8];
break;
};
};