Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.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 Ajax循环和响应顺序_Javascript_Jquery_Ajax_Geoserver - Fatal编程技术网

Javascript Ajax循环和响应顺序

Javascript Ajax循环和响应顺序,javascript,jquery,ajax,geoserver,Javascript,Jquery,Ajax,Geoserver,我正在使用$.ajax从服务器(geoserver)检索一系列数据 (简化的)请求如下所示: var dataList=[]; //var urllist= // a list of several URLs to request data from $.each(urllist,function(i) { $.ajax({ jsonpCallback: 'getJson', type: 'GET', url: urllist[i

我正在使用$.ajax从服务器(geoserver)检索一系列数据

(简化的)请求如下所示:

var dataList=[];
//var urllist= // a list of several URLs to request data from


$.each(urllist,function(i) {
    $.ajax({
         jsonpCallback: 'getJson',
         type: 'GET',
         url: urllist[i],
         dataType: 'jsonp',
         success: function(data) {
                    dataList[i]=data.value;
                  }
     })
});
我需要写入全局变量
dataList
,因为我需要在来自urllist的所有请求完成后触发一个事件。(我得到了像这样的延期)

问题在于完成的列表总是以不同的顺序排列。我需要结果与请求的顺序相同

如果索引
i
传递给ajax函数,而分配给
dataList
则可能是一个闭包问题,该问题将在稍后发生(当每个循环都继续运行时)。 我试着像这样处理,但问题还是一样。同样像上面的代码一样,应该为每个迭代创建一个单独的闭包

我已经成功地实现了一个,但是它是同步的


编辑:不处理循环ajax请求

您可以在
$中访问所有结果。当
以正确的顺序回调时

// map an array of promises
var deferreds = urllist.map(function(url){
    // return the promise that `$.ajax` returns
    return  $.ajax({         
         url: url,
         dataType: 'jsonp'
     }).then(function(data){
         return data.value;
     })
});

$.when.apply($, deferreds).then(function(results){
    // results will be array of each `data.value` in proper order
    var datalist = results;
    // now do whatever you were doing with original datalist
    $.each(datalist....

}).fail(function(){
    // Probably want to catch failure
}).always(function(){
    // Or use always if you want to do the same thing
    // whether the call succeeds or fails
});

问题与延迟无关,而是与请求所需的jsonp或相关的
jsonpcallback
有关。将数据请求为json解决了这个问题

对于在以下位置的答案,将积分计入@:


对于查找此内容的任何人:您很可能必须启用,以便能够直接访问JSON

可能重复的“索引可能存在关闭问题…”“不”我已经实现了延迟,如“嗯。。。不,你没有?你错过了美元。时间和回报。还有延迟数组。我添加了一个带有建议的答案,但现在我仔细阅读了您希望在所有请求完成时触发一个事件,但该事件不正确,因此我删除了。@KevinB:(简化的)请求如下:“。我故意省略了部分代码以保持文章简短。检查我提供的链接。否。你的问题需要有一个MCV,这样我就可以在结果中得到一个值。这就是为什么求助于success处理程序中的全局变量。我可以用$.when(deferreds[0])得到一个值。那么(function(data){value=data})有没有更简单的方法来访问deferreds中的数据?我只是用上面的方法检查了来自deferreds的值,并且顺序是随机的,谢谢。我会把你的答案标记为正确,因为我的问题显然是在其他地方。因为这与原来的“现在”完全不同,我在这里创建了一个新问题:。