.When()和.done()使用带.done的数组

时间:2014-03-14 21:29:11

标签: jquery

我正在编写一个谷歌内容脚本,我的程序需要对服务器进行大约30次AJAX调用。我正在使用JQuery的.when函数与.apply一起将一个数组传递给.when函数。我也在使用.done,我希望能够传入一个参数数组,这些参数将从.when函数中获取延迟对象。有没有办法做到这一点?这就是我想要做的。

    var callback = function(a) {
  console.log("done", a);
};
var requests = [];
var requestArray = [];
  for(i = 0; i < liclass.length; i++) {
  requests.push($.ajax({
      url: liclass[i],
     success: function() {;
      }
    }));
            var str = "messageArg" + i
        requestArray.push(str)
  }

$.when.apply($, requests).done(function(requestArray){
callback(requestArray)});

3 个答案:

答案 0 :(得分:3)

您是否希望将ajax响应放入数组并在所有ajax调用返回后执行回调?实际上,您可以从传递给.done()的参数中获取此类数组。

根据documentation for $.when

  1. 如果您在.done()返回的承诺上致电$.when 传递单个ajax请求延迟,回调的第一个参数 功能将是响应数据。
  2. 如果您在.done()返回的承诺上致电$.when 传递了多个ajax请求Deferreds,&#34;参数将是 请求的jqXHR对象,按照它们的给定顺序 参数列表。&#34;该陈述似乎有点不准确, 但是,因为示例中的注释指出:&#34;每个参数都是 具有以下结构的数组:[data,statusText,jqXHR]。&#34;
  3. 因此你可以试试:

    var requests = $.map(liclass, function(url) {
        return $.ajax(url);
    });
    
    $.when.apply($, requests).done(function() {
        var results = (requests.length > 1)
            ? $.map(arguments, function(a) { return a[0]; })
            : [arguments[0]];
        console.log(results);
    });
    

    Demo on JSFiddle

答案 1 :(得分:0)

如果查看examples for $.when,您会看到回调被传递给每个承诺的参数。如果该承诺来自Ajax调用,则每个参数都是[ data, statusText, jqXHR ]形式的数组。

所以你只需迭代参数并提取第一个元素。 $.map让这很容易:

$.when.apply($, requests)
  .then(function() {
    return $.map(arguments, function(v) {
      return v[0];
    });
  })
  .done(callback);

答案 2 :(得分:0)

我对延迟的东西(以及一般的jQuery)相当新,但我的帮助函数似乎工作。这些请求都不依赖于数据。我可能会编写一个类似的辅助函数来处理链式请求,这些函数必须使用.then()。

function sendRequests(requests, callbacks) {
    $.when(...requests).done(function(...results) {
            results.forEach(function(result, index) {
                    callbacks[index](JSON.parse(result[0]));
        });
    });
}

function req1Callback(data) {
    // do something with data object
}

var req1 = $.get(), // arguments omitted
    req2 = $.get(),
    req3 = $.get();

sendRequests([ req1, req2, req3 ], [ req1Callback, req2Callback, req3Callback ]);