34

我正在研究BreezeJs,并且有示例使用Q.js来处理异步调用的承诺。John Papa也在使用Q。JQuery 也有承诺。两者有什么区别?

4

3 回答 3

49

两者都基于Promises/A 标准并实现了一个then方法(尽管只有当前的 jQuery,它们曾经有一个不兼容pipe的而不是then)。但是,有一些区别:

  • Q 有异常处理。异步then回调中所有抛出的错误都将被捕获并拒绝承诺(并且只有在调用时才会重新抛出.end())。不知道我个人是否喜欢这样。这是 jQuery 不遵循的标准化方式,在 jQuery deferreds 中拒绝then要复杂得多
  • Q 承诺通过单个值/原因解决(就像您从 中返回/抛出它一样then),而 jQuery 允许在其 Deferreds 上resolve/调用多个参数。reject
  • Q 有很多代理方法可以让你修改未来的值
  • Q has.all和类似,使用 jQuery ( ) 更复杂$.when.apply($, […])
  • Q 确实在事件循环中显式处理滴答声并保证异步性,而 jQuery 也可以是同步的。这现在是Promises A/+ 规范所要求的。

......这基本上是Promises/B。如您所见,QAPI 更强大,并且(恕我直言)设计得更好。取决于你想要做什么,Q可能是更好的选择,但也许 jQuery(特别是如果已经包含)就足够了。

于 2012-11-28T18:26:37.150 回答
18

JQuery 的 Promises/A 规范的 promise 实现存在一些实际问题。以下链接比我能更好地描述它们:missing-the-point-of-promises

于 2013-03-20T17:03:29.630 回答
13

伯吉的回答很好地涵盖了一切。不过,我想补充一点,我们已经为来自 jQuery 的 Q 用户创建了指南。总结相关部分:

  • Q 处理异常,允许您通过统一的接口处理所有错误。
  • Q 专注于链接所有方法,而 jQuery 只允许从then/链接pipe
  • Q 承诺保证异步性,从而避免由 jQuery 的有时同步,有时异步行为导致的控制流危险和竞争条件。
  • Q Promise 总是以单个值实现或以单个原因被拒绝,就像同步函数总是返回单个值或抛出单个异常一样。
  • Q 强制将 deferred 和 promise 分开,而 jQuery 将它们合并到一个对象中,并可以选择将它们分开。
  • Q 不跟踪上下文对象以及履行或拒绝,因为这与同步函数没有并行性(即,您永远不会返回一个值以及this调用者必须在其中运行的 a)。所以没有resolveWithor rejectWith
  • Q 使用 Promises/A+ 术语;主要区别在于 Q 使用“fulfilled”,而 jQuery 使用“resolved”,而在 Q 中,“resolved”意味着更微妙的东西。

该指南还包含一个与 jQuery 和 Q Promise API 并行的表格。

于 2013-10-07T07:44:48.070 回答