2013-02-21 42 views
3

Recently我问我怎么可能会引发可变数量get()请求jQuery和我收到的这个代码作为一个真正有效的工作方案:多个完成()在一个jQuery中推迟 - 它是如何工作的?

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

我正在寻找的是如何解释确切地说,这与每个promise.then()附带的多个done()一起工作,然后最后的done()附加到承诺本身。这是否是一个承诺(从我的理解是一种特殊类型的延期本身)可以完成,那么延期本身也可以完成?如果它不在一个循环中,那么这个语法看起来会是什么样的,例如,连续三个ajax请求?只是试图让我的头在附近。谢谢!

回答

2

承诺是延期的包装,隐藏了resolvereject方法,这种延迟的公共接口。对于then()done(),如果您在延期或承诺中使用它们,则不会有任何区别。我将从现在开始使用这个术语。

这就是说,done()返回允许链接的延迟本身。您可以像这样添加尽可能多的完成(和失败)处理程序。他们将被逐一调用。

then()返回一个新的延迟*,它可以有它自己的完成和失败处理程序。

注意,在你的代码替换在每个循环迭代变量promise递延,因此最终done()不叫上原来推迟,但最新的,由最后then()返回。

在一行链接所有电话会看起来像(每个then()返回一个新的承诺,标志着我,对其中的done()方法被调用。):

d.then().done().then().done().then().done().then().done().done(); 
     ^^^^^^  ^^^^^^  ^^^^^^  ^^^^^^^^^^^^^ 
     promise 1  promise 2  promise 3  promise 4 

*)实际上它的承诺

+0

谢谢你的解释。我有点困惑:__“请注意,在你的代码中,你替换了每次循环迭代中promise变量的延迟”__'promise = promise.then'似乎不像是替换,而是串联。这是不正确的? – 1252748 2013-02-21 21:59:23

+0

不正确。我相信你编码了很多PHP?在JavaScript中,点不是连接运算符,它就像PHP中的' - >';-) – 2013-02-21 22:01:54

+0

哈哈,是的。好的。你能否解释最后一句说“*)实际上是承诺”。 – 1252748 2013-02-22 00:22:19

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

当您不知道您正在使用多少个延迟对象时,此方法效果相当好。

+0

我在第一篇文章中收到了类似于这个的答案,但我真的不知道'apply'是怎么回事。它如何被使用?什么是'$'作为第一个参数?谢谢 – 1252748 2013-02-21 21:55:50

+0

实际答案,他们用'null'作为第一个参数:'$ .when.apply(NULL,dfdArr).done(函数(){ 在辩论(响应){ \t \t \t html_str + = arguments [response] [0];' – 1252748 2013-02-21 21:56:44

+0

'''参数'从哪里来的?什么产生的? – 1252748 2013-02-21 21:57:27

相关问题