【发布时间】:2014-06-01 14:44:40
【问题描述】:
我下面的答案有一个工作代码示例和一个解释
我正在尝试通过在 Google 地图 API 的帮助下创建旅行销售员算法来了解异步编程。
这是它的工作原理:
- 我们有一个地址字符串列表
addresses - 对于地址 [i] 和 [j] 的每个组合,我们使用 google 计算距离
方向服务,我们将其存储在 Javascript 对象 (
distanceTable) 中。 - tspSolver 应该在我们获得所有距离后运行(尚未实现)。
我的天真代码如下。如您所见,有几个问题,所有这些都与回调有关:
我将directionResults 作为回调传递给方向服务。它正确计算了距离,但由于我不再在循环内构造距离表,因此我无法正确存储结果。我注释掉了应该存储它的部分,但这显然只在循环内有效。
我将tspSolver 作为allDistances 的回调传递给我。但是我注意到它在距离由directionResults 计算之前执行。我的猜测是我必须做某种形式的回调嵌套?
谁能帮助我理解这一点。
gMap.directionsService = new google.maps.DirectionsService();
var addresses = ['Dam, Amsterdam','Spui, Amsterdam','Middenweg, Amsterdam'];
var distanceTable = {};
//all combinations of addresses with distances, for use in TSP algorithm
//{
// addressA {
// addressB: 2000
// addressC: 2500
// }
// addressB {
// addressC: 1800
// }
function tspSolver(distanceTable) {
console.log('Distances are there, now for some clever TSP algorithm')
//this should only be executed after the distances are returned.
}
function allDistances(addresses, callback) {
for(var i=0; i<addresses.length; ++i) {
distanceTable[addresses[i]] = {};
for(var j=i+1; j<addresses.length; ++j) {
// Compose request for every pair of addresses (one way)
var request = {
origin: addresses[i],
destination: addresses[j],
travelMode: 'DRIVING'
};
console.log(request);
gMap.directionsService.route(request, directionResults);
}
}
callback(distanceTable)
}
function directionResults(result, status) {
console.log("Receiving request for route");
console.log(result);
if (status == google.maps.DirectionsStatus.OK) {
var totalDistance = 0;
var legs = result.routes[0].legs;
for(var i=0; i<legs.length; ++i) {
totalDistance += legs[i].distance.value;
}
console.log(totalDistance);
// I really want to add it to the distanceTable...
//distanceTable[addresses[i]][addresses[j]] = totalDistance;
}
}
//call function to start solving
function executeTSP() {
allDistances(addresses, tspSolver);
}
【问题讨论】:
标签: javascript google-maps asynchronous callback