从数组调用多个ajax并在完成时处理回调

use*_*408 18 ajax jquery callback deferred

我之前稍微使用过jQuery中的promises - 但是我在将这个应用到这个场景时遇到了麻烦.我更喜欢使用$ .when()和$ .done()方法来实现这一点.

根据我的理解,我需要构建一个$ .Deferred对象来记录请求,当这些请求完成时 - 触发回调.在我的代码下面,回调是 ajax请求之前触发而不是之后 - 也许我只是需要一些睡眠

我知道我的代码不完整我一直在努力通过添加for循环来应用它.

http://jsfiddle.net/whiteb0x/MBZEu/

var list = ['obj1', 'obj2', 'obj3', 'obj4', 'obj5'];
var callback = function() {
  alert("done");
};
var requests = [];

var ajaxFunction = function(obj, successCallback, errorCallback) {
  for(i = 0; i < list.length; i++) {
    $.ajax({
      url: 'url',
      success: function() {
            requests.push(this);
      }
    });
  }
};
$.when($.ajax(), ajaxFunction).then(function(results){callback()});
Run Code Online (Sandbox Code Playgroud)

Exp*_*lls 51

参数$.when应该是返回值$.ajax,也不需要单独调用 - 这没有任何意义.你想要这样的东西:

for (i = 0; i < list.length; i++) {
   requests.push($.ajax(...));
}
$.when.apply(undefined, requests).then(...)
Run Code Online (Sandbox Code Playgroud)

.apply需要的原因是因为$.when可以采用多个参数,但不能使用参数数组. .apply主要扩展到:

$.when(requests[0], requests[1], ...)
Run Code Online (Sandbox Code Playgroud)

这也假定请求可以按任何顺序完成.

http://jsfiddle.net/MBZEu/4/ - 注意在完成所有成功消息后,"done"会记录到控制台.

  • 如何一次处理所有结果? (3认同)
  • 正如@MKYung所问,处理结果可能是一个问题...因为,如果你在请求列表中只有一个元素,你将在方法`done`中得到一个重新调整的结果,但是分成三个参数`jqXHR .done(function(data,textStatus,jqXHR){...});`.但是对于多个请求,你得到了包含在数组中的所有三个参数,例如`jqXHR.done(function([data,textStatus,jqXHR],[data,textStatus,jqXHR],...){...});`.要在`done`方法中处理它,你必须知道请求的数量,在这种情况下`list.length`来决定如何解析结果...... (2认同)

Kan*_*bos 7

我分享了一个简单的例子,可以帮助您处理多个请求及其响应:

var arr = [
    $.ajax({url:"test1.php"}),
    $.ajax({url:"test2.php"}),
    $.ajax({url:"test3.php"})
];
$.when.apply( undefined, arr ).then(function() {
    var objects=arguments;
    console.dir(objects);
});
Run Code Online (Sandbox Code Playgroud)