Recently我问过如何触发可变数量的jquery get()
请求,我收到这段代码作为一个非常有效的工作解决方案:
var d = new $.Deferred();
var promise = d.promise();
var results = [];
for (var i = 0; i < 5; i++) {
(function(i) {
promise = promise.then(function() {
return $.ajax('/echo/json/', {
data: {
json: JSON.stringify({foo: i})
}
}).done(function(data) {
results[i] = data;
});
});
}(i));
}
promise.done(function() {
console.log(results);
});
d.resolve();
我正在寻找一个解释,说明这对于每个done()
附加的多个promise.then()
是如何工作的,然后是附加到承诺本身的最终done()
。这是一个承诺(从我所理解的是一种特殊类型的延迟本身)可以完成,那么延期本身也可以完成吗?如果它不在一个循环中,那么这个语法会是什么样的,例如,连续三个ajax请求?试着试着理解它。谢谢!
答案 0 :(得分:7)
如果你有一个延迟对象数组,你可以使用when
和apply
来实际处理它们,然后在它们上使用$.done()
:
$.when.apply($, deferredArray).done(function() {
for (var i = 0; i < arguments.length; i++) {
//arguments[i] is the return of the singular done() statement
}
});
当您不知道正在使用多少个延迟对象时,这很有效。
答案 1 :(得分:3)
promise是deferred的包装器,它隐藏了resolve
和reject
方法,即延迟的公共接口。对于then()
和done()
,如果您在延迟或承诺上使用它们没有任何区别。从现在开始,我将使用deferred这两个术语。
话虽如此,done()
返回延迟本身,允许链接。您可以根据需要添加尽可能多的已完成(和失败)处理程序。他们将逐一被召唤。
then()
会返回 new 延迟*,它可以拥有自己的已完成和失败的处理程序。
请注意,在您的代码中,您在每个循环迭代中替换promise
变量中的延迟,因此最终的done()
不会在原始延迟上调用,而是在最后一个上调用,由最后一个{ {1}}。
在一行中链接的所有调用看起来都是这样(每个then()
都会返回一个新的promise。我标记了then()
方法被调用的地方:
done()
*)实际上是它的承诺