【问题标题】:Use jQuery or Q.Js for promises使用 jQuery 或 Q.Js 实现承诺
【发布时间】:2012-11-16 15:19:47
【问题描述】:

我正在调查BreezeJs 并且有示例使用Q.js 来承诺处理异步调用。 John Papa 也在使用 Q。JQuery has promises as well。两者有什么区别?

【问题讨论】:

  • 只是我的 $.02。在为我们的 promise 实现选择 Q 之前,我研究了轻量级并查看了 jQuery 和 Q。当时,我试图了解其他图书馆作者正在使用什么以及为什么。我的结论是 Q 被压倒性地选择了,部分原因是它是一个没有 jQuery 重量的独立库,但也因为 jQuery 实现与 Q 之间存在许多细微但令人讨厌的差异,其中 jQuery 的实现并不严格符合 Promises/A 或 Promises/B。
  • 附带说明一下,我注意到谷歌创建了一个嵌入式版本的 Q 以在 angularjs 中使用。
  • 在某些情况下促使我使用 Q 的最大区别是,当我只需要 promises 时,Q 非常适合,而 jQuery 则更多。所以当你需要的只是承诺时,Q 是轻量级的。但是当我也经常使用 jQuery 时,我会使用 jQuery 的 Promise,因为我已经可以使用它们了。换句话说,两者都很棒:)
  • 如果你想要好的性能,我不推荐 Q 和 jQuery,看看 github.com/petkaantonov/bluebird 可以在这里看到基准:github.com/petkaantonov/bluebird/blob/master/benchmark/stats/…

标签: javascript jquery breeze promise q


【解决方案1】:

Bergi 的回答很好地涵盖了所有内容。不过,我想补充一点,我们已经创建了a guide for Q users coming from jQuery。总结相关部分:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 异常处理也是让我对 Q 感到失望的一件事。在我看来,异常应该只用于意料之外的事情,而不是用于常规错误。异常处理太重了,比传递错误代码等慢几个数量级。
    • @Domenic:感谢指正,是时候更新帖子了。我的意思是 jQuery 基于 Promises/A - 我知道这有一些严重的问题。
    • 这个答案已经有两年多了,从那以后事情没有改变吗?
    • @Vadorequest:不是真的。有关于 jQuery 的拉取请求以使其与 A+ 兼容,但 afaik 他们尚未被接受 - there still are multiple problems。过去几年唯一改变的是 Q 主要被其他更强大的 Promise 库取代:-)
    【解决方案3】:

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

    【讨论】:

    • +1 供文章参考。我以前读过那篇文章。终于巩固了我对 Promises 以及与 JQuery 规范的不同之处的理解。
    • 那篇文章很棒,但需要读几遍。我确实错过了承诺的意义。异常处理部分。
    猜你喜欢
    • 2013-12-03
    • 2016-11-06
    • 1970-01-01
    • 2014-06-13
    • 2014-12-29
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 2015-08-06
    相关资源
    最近更新 更多