使用jQuery或Q.Js进行承诺

时间:2012-11-28 17:15:43

标签: javascript jquery breeze promise q

我正在研究BreezeJs,并且有样本正在使用Q.js来承诺处理异步调用。 John Papa也在使用Q. JQuery has promises as well。这两者有什么不同?

3 个答案:

答案 0 :(得分:49)

两者都基于Promises/A standard并实施then方法(虽然只有当前的jQuery,但它们曾经有一个不兼容的pipe而不是then)。但是,存在一些差异:

  • Q有异常处理。将捕获异步then回调中的所有抛出错误并拒绝承诺(并且只有在您调用.end()时才会重新抛出)。不确定我个人是否喜欢这样。这是jQuery不遵循的标准化方式,rejecting from then in jQuery deferreds is much more complicated
  • Q promises使用单个值/原因解决(就像你从then返回/抛出它),而jQuery允许在其{Devers}的resolve / reject调用中使用多个参数。
  • Q有很多Proxy methods,可以让您修改未来的值
  • Q有.all且类似,jQuery($.when.apply($, […]))更复杂。
  • Q确实在事件循环中使用ticks并保证异步,而jQuery也可以是同步的。 Promises A/+ specification
  • 现在需要这样做

...基本上是Promises/B。如您所见,Q API更强大,而且(imho)设计得更好。根据你想要做的事情,Q可能是更好的选择,但也许jQuery(特别是如果已经包含)就足够了。

答案 1 :(得分:18)

JQuery承诺实施Promises / A规范有一些实际问题。以下链接比我更好地描述了它们:missing-the-point-of-promises

答案 2 :(得分:13)

Bergi的回答很好地涵盖了事情。不过,我想补充说,我们创建了a guide for Q users coming from jQuery。总结相关部分:

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

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