使用jQuery或Q.Js进行承诺

Ali*_*ned 34 javascript jquery promise breeze q

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

Ber*_*rgi 49

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

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

...它基本上诺言/ B.正如您所看到的,QAPI更强大,并且(imho)设计得更好.根据你想做的事情,Q可能是更好的选择,但也许jQuery(特别是如果已经包含)就足够了.

  • jQuery做*不*实现Promises/A:http://domenic.me/2012/10/14/youre-missing-the-point-of-promises/ (6认同)

Jay*_*and 18

JQuery承诺实现Promises/A规范有一些实际问题.以下链接比我更好地描述了它们:遗漏了承诺点


Dom*_*nic 13

Bergi的答案很好地涵盖了事情.不过,我想补充说,我们已经为来自jQuery的Q用户创建了一个指南.总结相关部分:

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

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