使用jQuery或Q.Js作为承诺
我正在研究BreezeJs,并且有示例使用Q.js来承诺处理asynchronous调用。 John Papa也使用Q. JQuery也有承诺 。 两者有什么区别?
两者都基于Promises / A标准,并实现了一个方法(尽pipe只有当前的jQuery,他们曾经有一个不兼容的pipe
而不是then
)。 但是,有一些区别:
- Q有exception处理。 在asynchronouscallback中抛出的所有错误都将被捕获并拒绝该承诺(如果调用
.end()
只会被重新抛出)。 不知道我个人是否喜欢这个。 这是jQuery不遵循的标准化方式, 从jQuery延期中拒绝是复杂得多 。 - Q的承诺是用一个单一的值/理由来解决的(就像你从那里返回/抛出),而jQuery允许在其Deferreds上
resolve
/reject
调用的多个参数。 - Q有很多代理方法可以让你修改未来的值
- Q有
.all
和类似的,用jQuery($.when.apply($, […])
)更复杂。 - Q确实可以在事件循环中使用tick,并保证asynchronous,而jQuery也可以是同步的。 Promise A / +规范现在需要这个。
这基本上是Promises / B 正如你所看到的, Q
API更强大,而且(imho)devise得更好。 取决于你想做什么, Q
可能是更好的select,但也许jQuery(特别是如果已经包括)就足够了。
JQuery对Promises / A规范的承诺实现有一些实际问题。 下面的链接描述了他们比我能做得更好的方面: 缺less这个承诺的意义
Bergi的回答涵盖了相当好的事情。 不过,我想补充一点,我们已经为来自jQuery的Q用户创build了一个指南 。 总结相关部分:
- Q处理exception,使您能够通过统一的界面处理所有错误。
- Q关注所有方法的链接,而jQuery只允许从/
pipe
链接。 - Q承诺保证asynchronous性,从而避免由于jQuery有时同步,有时是asynchronous行为而导致的控制stream风险和竞争条件。
- Q承诺总是用单个值来实现,或者被单个原因拒绝,就像同步函数总是返回一个值或抛出一个exception一样。
- Q强制延迟和承诺之间的分离,而jQuery将它们合并成一个对象与select分离它们。
- Q不追踪上下文对象以及履行或拒绝,因为这对于同步函数没有并行(即,您永远不会返回一个值,也不会返callback用者必须运行的值)。 所以没有
resolveWith
与rejectWith
。 - Q使用Promises / A +术语; 主要区别在于Q在jQuery使用“已解决”的地方使用“已完成”,而在Q“解决”意味着更加微妙的东西。
该指南还包含一个与jQuery和Q promise API平行的表。