Javascript Ajax循环和响应顺序
我正在使用$.ajax从服务器(geoserver)检索一系列数据 (简化的)请求如下所示: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
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的值,并且顺序是随机的,谢谢。我会把你的答案标记为正确,因为我的问题显然是在其他地方。因为这与原来的“现在”完全不同,我在这里创建了一个新问题:。