为啥在使用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
和承诺的同步检查。
默认情况下,当 throw
ing 在 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 和 coffeescript 的简单 promise 示例在一半时间内有效