我正在研究BreezeJs,并且有示例使用Q.js来处理异步调用的承诺。John Papa也在使用Q。JQuery 也有承诺。两者有什么区别?
问问题
13309 次
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。如您所见,Q
API 更强大,并且(恕我直言)设计得更好。取决于你想要做什么,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)。所以没有resolveWith
orrejectWith
。 - Q 使用 Promises/A+ 术语;主要区别在于 Q 使用“fulfilled”,而 jQuery 使用“resolved”,而在 Q 中,“resolved”意味着更微妙的东西。
该指南还包含一个与 jQuery 和 Q Promise API 并行的表格。
于 2013-10-07T07:44:48.070 回答