使用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用者必须运行的值)。 所以没有resolveWithrejectWith
  • Q使用Promises / A +术语; 主要区别在于Q在jQuery使用“已解决”的地方使用“已完成”,而在Q“解决”意味着更加微妙的东西。

该指南还包含一个与jQuery和Q promise API平行的表。

Interesting Posts