<小时/>
我的下面的答案有一个有效的代码示例和解释
<小时/>我正在尝试通过在 Google map API 的帮助下创建旅行推销员算法来了解异步编程。
它应该如何工作:
- 我们有一个地址字符串列表
地址
- 对于地址 [i] 和 [j] 的每个组合,我们使用 google 计算距离
DirectionService,我们将其存储在 Javascript 对象 (
distanceTable
) 中。 - tspSolver 应该在我们获得所有距离后运行(尚未实现)。
我的简单代码如下。正如您所看到的,存在几个问题,所有这些问题都与回调有关:
我将directionResults
作为回调传递给directionService。它正确地计算了距离,但由于我不再在构造距离表的循环内,所以我无法正确存储结果。我注释掉了应该存储它的部分,但显然这只在循环内有效。
我将我的 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);
}
最佳答案
我假设您需要通过请求传递回调
回调是异步编程时继续执行的方式。
伪示例:
function doAcync(callback)
{
//gets result
callback(result);
}
function one()
{
doAcync(two);
}
function two(result)
{
doAcync(three);
}
function three(result)
{
// continue with your live
}
关于javascript - 理解异步 JavaScript(谷歌地图),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23131269/