Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript中对服务的异步调用_Javascript_Leaflet - Fatal编程技术网

javascript中对服务的异步调用

javascript中对服务的异步调用,javascript,leaflet,Javascript,Leaflet,在我的项目中,我使用cloudmode服务在javascript中调用同一服务2-3次以上,以查找路线的距离和时间 我有一条多段线,我得到多段线的每一个点&将两个连续的点传递给服务以从中获得响应 我正在做的是 function showPointsRoutes(e) { var a = e.target.getLatLngs(); for(var i = 1 ; i < a.length ; i++)

在我的项目中,我使用cloudmode服务在javascript中调用同一服务2-3次以上,以查找路线的距离和时间

我有一条多段线,我得到多段线的每一个点&将两个连续的点传递给服务以从中获得响应

我正在做的是

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);
        }
函数showPointsRoutes(e)
{
var a=e.target.getLatLngs();
对于(变量i=1;i
但有时会发生的情况是,对某些请求的响应来得很晚。 由于这个原因,我没有得到正确的时间和点之间的距离。
有谁能建议一些方法,让我以请求的顺序获取数组中的值。

它们给您不同的回调名称的原因是,您可以通过对每个请求使用不同的回调来区分请求。试着这样做:

注意:@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);
}
函数showPointsRoutes(e)
{
var a=e.target.getLatLngs();
对于(变量i=1;i
您可以指定中转点,然后只执行一个请求,请参见此处:我在这两个点之间没有任何中转点。然后使用@Dark Falcon solution,似乎对meIt有效,但对我无效。同样的事情正在发生。有些时候,响应来得很晚,所以值会被洗牌以获得分数。同样的情况也会发生。有些时候响应来得晚,所以值会被洗牌。如果使用我发布的代码,这是不可能的。每个响应都放在自己的索引中,该索引直接对应于源数据的索引。问题一定出在您尚未发布的代码中。我明白了。问题是当我试图显示它时,我试图直接从GetRouterResponse函数中显示它,因为我的顺序错误。@Rodrigassis请给出JSFIDLE LINK如果您看到示例,如果您添加了3个以上的点,那么在显示订单更改时您将看到这一点。