我一直在研究jquery延迟对象一段时间了,我对一件事感到难过。
“完成”,“总是”,“然后”等方法采用在解析延迟对象时应调用的函数作为参数。
但是我尝试通过将延迟对象传递给“always”方法来链接请求,并且似乎也可以工作:
// A is an array of data
var req = ajax(url + "?d=" + A[0]).done(processResults).fail(reportFailure);
for (var i = 1 ; i < A.length ; i++) {
var tmp = ajax(url + "?d=" + A[i]).done(processResults).fail(reportFailure);
req.always(tmp);
req = tmp;
}
然而,它并没有真正起作用。因为当我按照上面的代码执行此操作时:
req.always(foobar);
foobar似乎在某个随机时间被调用,不一定是在处理数组中的最后一个元素之后。
使用何时更好?
// A is an array of data
var req = $.when(ajax(url + "?d=" + A[0]).done(processResults).fail(reportFailure));
for (var i = 1 ; i < A.length ; i++) {
req = $.when(req, ajax(url + "?d=" + A[i]).done(processResults).fail(reportFailure));
}
req.always(foobar);
上面的代码(使用“when”)会导致ajax请求一个接一个地发生,还是会同时发生?
顺便说一句,我看着用“管道”链接,但由于范围问题,我认为如上所述使用带有for循环的“管道”会更难。
另外,为什么原始代码“几乎可以工作”?那里发生了什么?它是否正在执行延迟对象,就像它是一个函数一样,当它执行时会发生什么?
答案 0 :(得分:2)
您应该构建一个数组并使用javascript apply:
//create an array of one deferred per element
var requests = $.map(A, function(index, a){return= $.ajax(url + "?d=" + a);});
//merge all deferreds into a single one
var mergedRequest = $.when.apply(null, requests);
mergedRequest.done(function(res0, res1, ...){
//your code goes here
//if you want results as an array just use arguments
arguments.length == A.length;
});
编辑: 如果您希望连续拨打电话,请执行以下操作:
var result = $.ajax(url + "?d=" + A[0]);
for (var i = 1 ; i < A.length ; i++) {
result = result.pipe(function() {
return $.ajax(url + "?d=" + a[i]);
}
}
result.done(processResults).fail(reportFailure);