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

我正在编写一个谷歌内容脚本,我的程序需要向服务器进行大约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)}); 

如果你查看$.when的例子 ,你会看到回调被传递给每个promise的参数。 如果该promise来自Ajax调用,那么每个参数都是[ data, statusText, jqXHR ]forms的数组。

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

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

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

根据$.when的文档 :

  1. 如果在$.when返回的Promise上调用.done()$.when传递单个ajax请求Deferred时,回调函数的第一个参数将是响应数据。
  2. 如果你在$.when返回的Promise上调用.done() ,当它传递多个ajax请求Deferreds时,“参数将是请求的jqXHR对象,按照它们在参数列表中给出的顺序。” 但是,该语句似乎有点不准确,因为示例中的注释声明:“每个参数都是一个具有以下结构的数组:[data,statusText,jqXHR]。”

因此你可以尝试:

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

演示JSFiddle

我对延迟的东西(以及一般的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 ]);