似乎 Bluebird 在生成器/协程相关功能中与 Co 重叠。Bluebird 被认为具有出色的速度性能,所以为了讨论,(假设上述重叠前提是正确的)如果想在 Koa(Node.js 上下文)中用 Bluebird 代替 Co,是否可以在不降低 Koa 的情况下轻松完成功能,如果是这样怎么办?
(我的猜测是它实际上无法完成,因为它似乎 Koa 是基于 Co 构建的并且没有明确地公开它,而是将其暴露出来。这样的替换似乎无异于用 Bootstrap 中的其他东西替换 jQuery)
首先,bluebird 和 co 没有可比性。你的意思是Bluebird.coroutine
vs co
(协程的缩写)。
Bluebird.coroutine
现在,和之间的区别在于co
,co
它只允许您产生一组特定的硬编码类型。虽然Bluebird.coroutine
可以配置为支持产生任意类型,但文档例如包含如何添加对产生 thunk 和回调的支持的示例。
异步生成器是如此微不足道,实现之间唯一的区别就是你可以产生什么类型以及它是如何执行的。没有太大的好或坏的空间。
然而bluebird.coroutine
,这只是蓝鸟功能的一小部分。
生成器只解决了使一系列动作不那么冗长的问题。有很多有用的功能可以满足更高级的需求,例如资源管理、并发协调、错误处理、取消+超时和长堆栈跟踪,如果您只有由 thunk/callbacks/minimal promises 提供支持的异步生成器,这些是不可能或极其痛苦的。
您可以co
通过配置 co 支持的所有产量类型,然后只使用bluebird.coroutine
:
var co = require("bluebird").coroutine;
// Configure all yield types you need using co.addYieldHandler
// See documentation for examples
module.exports = co;
然而,这并没有任何意义,因为实际上很少有代码应该直接在您的请求处理程序中运行——请求处理程序调用的函数却可以。koa 没有帮助这些功能(嗯,那么 koa 又有什么意义呢?:D),所以它们可以直接成为蓝鸟协程。
esailija 是这么说蓝鸟的,
正在添加一个功能,它不仅允许产生回调、thunk 等,还允许您想到任何任意事情。蓝鸟也是最快的。所以在这个版本之后,koa 确实应该只是使用 bluebird。见https://github.com/petkaantonov/bluebird/issues/131#issuecomment-36975495
也就是说,我不相信他。而且,我不相信 bluebird wrapper 会比 Co 更快——如果有可能的话。Co.js 有效,目前无法让 Bluebird.js 通过测试。如果您使用的是 ES6,请完全忽略 Bluebird 并使用 Co.