22

我之前在 jQuery 中使用过承诺 - 但我无法将它应用于这种情况。我更喜欢使用 $.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()});
4

2 回答 2

57

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

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

需要的原因.apply是因为$.when可以接受多个参数,但不能接受参数数组。 .apply基本上扩展为:

$.when(requests[0], requests[1], ...)

这也假设请求可以按任何顺序完成。

http://jsfiddle.net/MBZEu/4/ - 请注意,在所有成功消息之后,控制台都会记录“完成”。

于 2013-01-16T05:59:26.110 回答
9

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

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);
});
于 2016-10-10T18:21:17.720 回答