【问题标题】:Multiple ajax calls from array and handle callback when completed来自数组的多个 ajax 调用并在完成时处理回调
【发布时间】:2012-12-30 09:38:37
【问题描述】:

我之前在 jQuery 中使用过 Promise,但我无法将它应用到这种场景中。我更喜欢使用 $.when() 和 $.done() 方法来实现这一点。

据我了解,我需要构建一个 $.Deferred 对象来记录请求以及这些请求何时完成 - 触发回调。在我下面的代码中,回调是触发 before 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()});

【问题讨论】:

标签: jquery ajax callback deferred


【解决方案1】:

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

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);
});

【讨论】:

    【解决方案2】:

    $.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/ -- 请注意,在所有成功消息之后,控制台都会记录“完成”。

    【讨论】:

    • 如何一次处理所有结果?
    • $.when.apply(undefined, requests).done(function(response1, response2, ...){ if(response1[1]=="success") {// DoSomething with response1 [0]} });
    • 仍然,如何获取数组中的所有响应?你不能指望一个人事先知道会有多少响应。
    • 正如@MKYung 所问,处理结果可能是个问题......因为,如果您在请求列表中只有一个元素,您将在方法@987654329 中获得一个重新调整结果@但分为三个参数jqXHR.done(function( data, textStatus, jqXHR ) { ... });。但是对于多个请求,您将所有三个参数都包装在数组中,例如jqXHR.done(function( [data, textStatus, jqXHR], [data, textStatus, jqXHR], ... ) { ... });。要在 done 方法中处理它,您必须知道请求的数量,在这种情况下 list.length 来决定如何解析结果...
    猜你喜欢
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    相关资源
    最近更新 更多