异步调用javascript中的服务

时间:2013-03-22 12:14:30

标签: javascript leaflet

在我的项目中,我使用相同的服务超过2-3次寻找距离&使用cloudmode服务在javascript中使用我的路线的时间。

我有一条折线,我得到折线和折线的每个点;将两个连续点传递给服务部门以获得响应。

我正在做的是

function showPointsRoutes(e)
        {
            var a = e.target.getLatLngs();
            for(var i = 1 ; i < a.length ; i++)
            {
             var as ="http://routes.cloudmade.com/BC9A493B41014CAABB98F0471D759707/api/0.3/" + a[i-1].lat+","+a[i-1].lng+","+a[i].lat+","+a[i].lng + "/car/shortest.js?callback=getRouteResponse";
             addScript(as);
            }
        }


    function getRouteResponse(response) 
      {
        mytimeArray.push[response.route_summary.total_time];
        myDistancArray.push[response.route_summary.total_distance];
      }

     function addScript(url) 
      {
            var script = document.createElement('script');
            script.type="text/javascript";
            script.src=url;
            document.getElementsByTagName('head') [0].appendChild(script);
        }

但有时会发生一些请求的响应迟到。 由于这个原因,我没有得到适当的时间和点之间的距离。 任何人都可以提出某种方式,以便我将数组中的值作为发出请求的序列。

1 个答案:

答案 0 :(得分:1)

他们为您提供不同回调名称的原因是,您可以通过对每个回调使用不同的回调来区分请求。尝试这样的事情:

注意:@Rodrigo Assis的建议在这种情况下会更好,因为API支持这一点。下面的代码演示了当API强制使用多个请求时处理此问题的方法。

function showPointsRoutes(e)
{
  var a = e.target.getLatLngs();
  for(var i = 1 ; i < a.length ; i++)
    requestRoute(i, a[i-1], a[i]);
}

function requestRoute(i, a, b)
{
  window["getRouteResponse" + i] = function(response)
  {
    mytimeArray[i] = response.route_summary.total_time;
    myDistancArray[i] = response.route_summary.total_distance;
  };

  var as ="http://routes.cloudmade.com/BC9A493B41014CAABB98F0471D759707/api/0.3/" + a.lat+","+a.lng+","+b.lat+","+b.lng + "/car/shortest.js?callback=getRouteResponse" + i;
  addScript(as);
}

function addScript(url) 
{
  var script = document.createElement('script');
  script.type="text/javascript";
  script.src=url;
  document.getElementsByTagName('head') [0].appendChild(script);
}