为啥在使用promise时使用Q,bluebird框架? [复制]

Posted

技术标签:

【中文标题】为啥在使用promise时使用Q,bluebird框架? [复制]【英文标题】:Why it use Q,bluebird framework when using promise? [duplicate]为什么在使用promise时使用Q,bluebird框架? [复制] 【发布时间】:2016-07-02 14:04:30 【问题描述】:

在 node.js 中学习 promise 的过程中。我有一些疑问。 'promise' 已在 node.js 中定义 但通常它似乎使用额外的承诺框架,如 Q、bluebird、RSVP 等。 有什么原因吗?

是node.js核心函数不能支持promise和promise.denodeify函数的原因吗?

【问题讨论】:

【参考方案1】:

嗯,promise 是原生 javascript 对象。所有这些库都是用户态实现。例如,如果我们看一下 bluebird,它有:

许多实用功能和助手,让您的生活更轻松。 它已经输入了.catch,这样可以确保你不会误抓程序员的错误。 它有.some.any.map.filter等,可以轻松处理集合。 它具有.reflect 和承诺的同步检查。 默认情况下,当 throwing 在 then 处理程序中时,它不会吞下错误。 内置协程(生成器)支持扁平化异步流。 它比不同浏览器中的原生 Promise 更快(通常在 4 倍到 10 倍之间)。 它提供了更多的调试钩子和更好的堆栈跟踪。 它针对常见的 Promise 反模式提供警告。 它允许您覆盖调度程序,以便确定它如何调度任务。 它支持具有健全语义的 Promise 取消,这是针对本机 Promise 提出的,但尚未采用。

所以在 tl;dr; :

更快。 它更易于调试。 它有更丰富的 API。

现在,您是否应该使用它取决于您 - 包含库总是有开销 - 作为核心贡献者,我有偏见。

【讨论】:

【参考方案2】:

我不能说 Q,但 Bluebird 比原生 Promises 快很多,并且在原生 Promise 之上提供了一堆额外的功能。

这与人们使用lodash 的原因相同,尽管多年来一直使用[].map()

此外,Bluebird 比原生的 Promise 实现具有更好的浏览器支持。


不过,您通常只在服务器上使用 Bluebird。额外的功能和速度不值得用户下载额外的库。

【讨论】:

只是将这个附加到这个答案上,这些benchmarks 强化了这个答案。 Bluebird 现在比几乎任何其他异步方法的性能都要高得多。不过,ES6 Native Promises 比 Q 性能更高,这是值得注意的。 Bluebird 还拥有promisification 的非承诺库,这是使用 Bluebird 的另一个巨大好处。

以上是关于为啥在使用promise时使用Q,bluebird框架? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Mongoose FindOne 和 Bluebird Promises 在循环中构建数组

从异步等待函数中获取 Bluebird Promise

使用 bluebird 和 coffeescript 的简单 promise 示例在一半时间内有效

你能避免使用 Promises 完全嵌套吗? [复制]

Bluebird Promise.all - 多个 Promise 完成聚合成功和拒绝

async库中的async.map与bluebird的Promise.map有什么区别?