多个REST调用 - 最佳实践

时间:2013-07-18 09:17:37

标签: jquery rest asynchronous

我想做以下事情:

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调用完成? 寻求帮助

2 个答案:

答案 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]
    }
}

希望这有帮助。