延迟的jquery中的多个done() - 它是如何工作的?

时间:2013-02-21 20:35:25

标签: jquery jquery-deferred

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

fiddle

我正在寻找一个解释,说明这对于每个done()附加的多个promise.then()是如何工作的,然后是附加到承诺本身的最终done()。这是一个承诺(从我所理解的是一种特殊类型的延迟本身)可以完成,那么延期本身也可以完成吗?如果它不在一个循环中,那么这个语法会是什么样的,例如,连续三个ajax请求?试着试着理解它。谢谢!

2 个答案:

答案 0 :(得分:7)

如果你有一个延迟对象数组,你可以使用whenapply来实际处理它们,然后在它们上使用$.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的包装器,它隐藏了resolvereject方法,即延迟的公共接口。对于then()done(),如果您在延迟或承诺上使用它们没有任何区别。从现在开始,我将使用deferred这两个术语。

话虽如此,done()返回延迟本身,允许链接。您可以根据需要添加尽可能多的已完成(和失败)处理程序。他们将逐一被召唤。

then()会返回 new 延迟*,它可以拥有自己的已完成和失败的处理程序。

请注意,在您的代码中,您在每个循环迭代中替换promise变量中的延迟,因此最终的done()不会在原始延迟上调用,而是在最后一个上调用,由最后一个{ {1}}。

在一行中链接的所有调用看起来都是这样(每个then()都会返回一个新的promise。我标记了then()方法被调用的地方:

done()

*)实际上是它的承诺