0

我想做以下事情:

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是异步的,所以在加载所有数据之前迭代了第二个for循环。那么,我怎样才能等待所有 REST 调用完成呢?求帮助

4

2 回答 2

3

您可以利用$.when()延迟这一点。您不知道 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

});
于 2013-07-18T09:32:56.100 回答
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]
    }
}

希望这可以帮助。

于 2013-07-18T09:31:33.157 回答