我想做以下事情:
1.多个调用单个REST服务 2.存储所有接收到的数据 3.收到所有数据后,迭代数组过滤器并显示数据。
我有以下代码(不是精确副本,只是伪代码:))
for(var i = 0; i < numberOfRestCalls; i++){
$.ajax(
url: 'url'
success: function(result){
storeDataInArray();
}
)
}
for (var j = 0; j < array.length; j++){
if (array[j] == something)
displayData(array[j]);
}
但有时会发生,并非所有数据都被加载。这可能是因为ajax是异步的,所以在加载所有数据之前迭代第二个循环。 那么,我如何等待所有REST调用完成? 寻求帮助
答案 0 :(得分:3)
您可以利用$.when()
和deferreds进行此操作。您不知道ajax调用将以什么顺序完成,因此您可以对所有结果执行操作的唯一时间是它们都已完成。像以下这样的东西应工作
var ajaxCalls = [];
for(var i = 0; i < numberOfRestCalls; i++){
ajaxCalls.push($.ajax({ url: 'url' }));
}
$.when.apply($, ajaxCalls).done(function() {
// arguments here will be arrays for the ajax requests in
// ajaxCalls, where each array looks like [ data , statusText, jqXHR ]
var args = Array.prototype.slice.call(arguments, 0);
for(var i = 0; i < args.length; i++){
storeDataInArray(args[0])
}
// do something with all results from storeDataInArray() function calls
});
答案 1 :(得分:0)
不确定ajax,一种方法是使用storeDataInArray()函数在所有回调都来的时候打印数据。可以是一个计数器(比如COUNTER)计算对storeDataInArray()的调用次数。当COUNTER达到numberOfRestCalls时,我们可以将for循环放在其中以显示所有数据。
success: function(result){
counter++;//declare this somewhere in global scope
if(counter == numberOfRestCalls)
{
for (var j = 0; j < array.length; j++){
if (array[j] == something)
displayData(array[j]);
}
}
else
{
//store the data in array[counter]
}
}
希望这有帮助。