我正在编写一个谷歌内容脚本,我的程序需要对服务器进行大约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)});
答案 0 :(得分:3)
您是否希望将ajax响应放入数组并在所有ajax调用返回后执行回调?实际上,您可以从传递给.done()
的参数中获取此类数组。
.done()
返回的承诺上致电$.when
传递单个ajax请求延迟,回调的第一个参数
功能将是响应数据。.done()
返回的承诺上致电$.when
传递了多个ajax请求Deferreds,&#34;参数将是
请求的jqXHR对象,按照它们的给定顺序
参数列表。&#34;该陈述似乎有点不准确,
但是,因为示例中的注释指出:&#34;每个参数都是
具有以下结构的数组:[data,statusText,jqXHR]。&#34; 因此你可以试试:
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);
});
答案 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 ]);