javascript - 理解异步 JavaScript(谷歌地图)

标签 javascript google-maps asynchronous callback

<小时/>

我的下面的答案有一个有效的代码示例和解释

<小时/>

我正在尝试通过在 Google map API 的帮助下创建旅行推销员算法来了解异步编程。

它应该如何工作:

  1. 我们有一个地址字符串列表地址
  2. 对于地址 [i] 和 [j] 的每个组合,我们使用 google 计算距离 DirectionService,我们将其存储在 Javascript 对象 (distanceTable) 中。
  3. 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/

相关文章:

Javascript 后台循环

javascript - Angularjs通过过滤器获取indexOf

google-maps - 如何在谷歌地图中用图层可视化给定温度的数据?

javascript - 为 Apigee Edge 上的 Google Maps at work API 生成 HMAC 签名

javascript - Google map api 过滤器复选框

javascript - 正确处理 promise 拒绝

java - 如何使用 Netty 关闭异步 Http 请求的 AsyncHttpClient?

javascript - 从 Canvas 保存图像,而无需使用“另存为”

javascript - 如何在html视频标签中使用youtube视频

javascript - Paypal 不接受 angularjs 中的 FORM