我可以将Promises传递给jQuery.when(),还是仅传递给Deferreds?

时间:2016-04-05 18:43:54

标签: javascript jquery parameter-passing jquery-deferred .when

jQuery.when()的documentation表示此函数采用Deferreds。但是,它后来也说:

  

如果将单个参数传递给jQuery.when()并且它不是Deferred或Promise ...

这似乎暗示它也可以接受Promises。但Promise不是Deferreds - 它们有Deferred方法的一部分。我想你可以说Deferred是一个Promise,但Promise不是延期。

问题:

  1. $ .when()可以接受Promises还是Deferreds?这似乎适用于我的测试。
  2. 文档中是否有错误?我认为应该说$ .when()接受Promises,而不仅仅是Deferreds。

2 个答案:

答案 0 :(得分:3)

文档试图传达的是protected $dates = ['created_at', 'updated_at', 'expired_on']; 接受的值既不是expired_on,也不是$.when(),也不是jQuery.Deferred();该值将被视为已解决的jQuery.promise(),将在句子的下一部分进行描述

  

如果将单个参数传递给Promise并且它不是。{   延期或承诺,它将被视为已解决的延期和   附加的任何doneCallbacks将立即执行。

例如



jQuery.Deferred()

jQuery.when()




答案 1 :(得分:3)

  

我想你可以说Deferred是一个Promise,但是Promise不是延迟的。

实际上它们是完全不同的接口,只有jQuery在promise API中混合到它们的延迟中。见What are the differences between Deferred, Promise and Future in JavaScript?

  

$.when()可以接受Promises还是Deferreds?

是的,它可以同时使用。但请注意,当您已经知道有承诺或延期时,在其上调用$.when是没有意义的。

  

文档中是否有错误?

是的,显然。它甚至不是事实,它只将延迟和承诺视为异步值 - 而是它做了某种鸭子打字检查。你想看看actual implementation

if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) )
然后,它会对值调用promise method(或another promise method或任何.promise方法)并期望返回的对象具有相应的可链接方法来添加侦听器。