Bluebird Promise 库版本演进全解析:从 0.3.0 到 3.7.2 的完整变更日志深度解读
2026/9/20 20:45:00 网站建设 项目流程
  • 后端

【免费下载链接】bluebird

:bird: :zap: Bluebird is a full featured promise library with unmatched performance.

项目地址:https://gitcode.com/gh_mirrors/bl/bluebird
点击查看免费下载

本篇技术指南以仓库 docs/docs/changelog.md 为唯一主线,系统梳理 Bluebird 自 2013 年 0.3.0 至 2019 年 3.7.2 的全部版本记录,涵盖功能特性、Bug 修复、破坏性变更与维护节奏。读完本文,你将理解 Bluebird 六大核心能力(集合方法、协程、promisify、取消、超时、未处理拒绝监控)是如何在六年迭代中逐步成形与完善的,并能对照 src 源码定位关键实现的落点。

如何阅读这份变更日志

该文档采用「版本号 + 发布日期 + 分类条目」的结构,每个版本按FeaturesBugfixes(个别版本还有Misc)归类,条目后附带对应的 GitHub issue 编号(如[#1606](https://link.gitcode.com/i/0193daf9876d78d3ae7688a7e15936b1))。需要说明的是:

  • 部分早期版本(0.3.0 ~ 0.7.x 区间)的条目仅为feature/bugfix占位符,属于当年发布流水线的占位记录,实际改动未详细列出,阅读时不应据此推断具体功能;
  • 3.0.0 / 3.0.1 两个版本指向 新特性说明,2.0.0 则内嵌了完整的「What's new in 2.0」清单;
  • 文档中的 API 链接均指向文档站点 API 页,对应本仓库 docs/docs/api 目录下的同名 Markdown 文件(如.map→ map.md)。

一、3.x 时代(2015–2019):稳定期与生态整合

3.x 是 Bluebird 的长期稳定主线,从 2015 年 10 月 3.0.0 发布到 2019 年 11 月 3.7.2 收尾,四年间共 7 个次版本,节奏平缓、以修复为主。

3.7.x:收尾维护与 Promise.allSettled

  • 3.7.0(2019-10-01)新增Promise.allSettled方法(#1606)。该方法返回一个在所有输入 promise 都已敲定(settled)后才敲定的 promise,且始终以{value, reason, status}形式的数组完成,不会因某个输入被拒绝而拒绝。其实现位于 src/settle.js#L48:
Promise.allSettled = function (promises) { ... };
  • 3.7.1(2019-10-15)修复#1614#1613#1616三个问题;
  • 3.7.2(2019-11-28)修复 Firefox 下settimeout not initialized错误(#1623),这是调度器在浏览器环境初始化顺序上的兼容性修补。

3.6.0:AsyncResource 集成与未处理拒绝清理

3.6.0(2019-10-01)是本阶段功能量最大的一次发布:

  • 新增 AsyncResource 支持(#1403):当运行在支持async_hooks的 Node.js 环境中时,Bluebird 会为 promise 创建AsyncResource上下文,使基于 async 钩子的诊断工具(如 Node 的性能分析、CLS 类库)能够追踪 promise 的异步生命周期。实现在 src/promise.js#L34-L39:
var AsyncResource = util.isNode && util.nodeSupportsAsyncResource ? require("async_hooks").AsyncResource : null; // 构造 Promise 时:async: new AsyncResource("Bluebird::Promise")

环境检测在 src/util.js#L424 的nodeSupportsAsyncResource中完成,并通过 try/catch 包裹require("async_hooks"),在不支持的旧版本 Node 上自动降级为null,不影响正常功能。

  • 未处理拒绝事件清理:修复 .reduce(#1501)、Promise.reduce(#1502)、.map(#1487)、Promise.map(#1489)在特定路径下产生虚假 unhandled rejection 事件的问题;
  • 取消向上传播:修复 cancel 跳过向上传播的缺陷(#1459);
  • PromiseRejectionEvent 规范对齐:使PromiseRejectionEvent符合规范(#1509);
  • 栈溢出与性能:修复 Promise.each 的 maximum stack exceeded(#1326)、loadTimes弃用警告(#1505)、虚假未处理拒绝(#1468)。

3.5.x:tapCatch、Symbol.toStringTag 与内存保持

  • 3.5.0(2017-03-03)新增 .tapCatch 方法(#1220)——与.tap对称的"仅在拒绝时旁路观察"工具,其实现位于 src/finally.js#L114。同一版本还修复了 streamline 基准测试(#1233)、yield 函数被意外调用(#1314/#1315)、.props 空Map输入解析为空对象(#1338)、直接调用Promise(...)而未用new时的误导性报错(#1320),并为 webpack 增加专用入口(#1318);
  • 3.5.5(2019-05-24)为 Promise 增加Symbol.toStringTag支持(#1421),修复 IE9 下错误(#1591/#1592)、undefined 堆栈(#1537)、.catch 传非函数 handler 时从"立即抛错"改为"稍后抛错"(#1517);
  • 3.5.4 / 3.5.3分别是 VSCode 版本检测修复(#1576)与 acorn 依赖更新;
  • 3.5.2(2018-09-03)修复PromiseRejectionEvent缺少.reason/.promise属性(#1509/#1464),以及 promise 链在整条链全部敲定前一直保持内存引用的问题(#1544/#1529);
  • 3.5.1(2017-10-04)修复 async/await 场景下的虚假未处理拒绝(#1404)与非 Error 值报错的误报(#990)。

3.4.x:Promise.version 与 getNewLibraryCopy

  • 3.4.0(2016-05-17)新增Promise.version属性(#1042),以字符串形式暴露库版本(如"3.4.0"),源码中定义为 src/promise.js#L826 的Promise.version = "__VERSION__"(构建期替换);同时 .map/Promise.map/.filter/Promise.filter 在传入不合适的 options 参数时改为返回已拒绝的 promise(#1097);
  • 3.4.1(2016-06-17)新增 Promise.getNewLibraryCopy,实现位于 src/promise.js#L199,用于在全局被污染或需隔离配置时生成独立副本;
  • 3.4.7(2016-12-22)Promise.config返回对 Bluebird 库本身的引用、更新 Logo、修复基准测试、不再从堆栈中丢弃 SyntaxError 上下文、修复环境变量偶尔启用长堆栈的问题。

3.3.x:协程栈溢出、监控钩子与警告系统

  • 3.3.0(2016-02-12)取消 Promise.delay/.delay 返回的 promise 现在会调用clearTimeout#1000);新增监控与生命周期钩子(Promise Monitoring)以及'warning'钩子(#980)——这套钩子后来成为蓝鸟诊断能力的基础;
  • 3.3.3修复 promisified 函数返回的 promise 在大型数组中提前拒绝时 Promise.mapSeries/Promise.each 的栈溢出;
  • 3.3.2修复 .done() 堆栈缺少换行、并新增"深层循环解析"检测;
  • 3.3.1修复取消 .tap() handler promise 时的崩溃(#1006)。

3.2.x / 3.1.x:调度器与构建链

3.2.0 是一次损坏的构建版本(文档明确标注 "Broken build"),3.2.1 因浏览器崩溃回滚了监控特性,3.2.2 让构建脚本在无 TTY 环境下可用。3.1.x 则包含:node 0.12 生成器崩溃修复(#978)、.timeout() 取消时清理定时器(#926)、Promise.coroutine 保持原函数.length#927/#933)、.finally() 在 domain 激活时取消不触发 handler 的修复(#963),以及 3.1.0 引入的可单独配置"遗忘返回语句"警告(warning-explanations)。

3.0.x:从 2.x 到 3.x 的跨越

3.0.0(2015-10-27)与 3.0.1 直接指向 new-in-bluebird-3 说明破坏性变更(如移除 progression、deferreds 迁移等)。3.0.x 系列修复包括:Promise.config({longStackTraces: false})失效(#897)、.timeout() 未取消父 promise(#891)、node.js domains 崩溃(#829),以及3.0.3引入的环境变量约定:当NODE_ENV=development时可用BLUEBIRD_DEBUG=0关闭调试模式。这一环境变量约定一直沿用,相关说明见 environment-variables。

二、2.x 时代(2014–2016):功能爆发期

2.0.0:资源管理与并发协调重塑

2.0.0(2014-06-04)是 Bluebird 历史上最大的一次功能扩张,文档内嵌的 "What's new in 2.0" 清单要点如下:

  • 资源管理:新增 using() 与 disposer(),"再也不泄漏资源";
  • Promisification 升级:整模块一行代码 promisify;
  • .map()、.each()、.filter()、.reduce()从简单语法糖升级为并发协调工具,map/filter增加concurrency选项,回调在输入项一敲定即被调用;
  • 同步检查:移除.inspect(),新增 .value() 与 .reason()(见 synchronous-inspection);
  • .cancel() 支持自定义取消原因;.timeout() 由"拒绝"改为"取消";
  • .nodeify() 支持多成功结果映射;Promise.promisifyAll() 增加suffixfilter选项。

破坏性变更:稀疏数组空洞不再被集合方法跳过而是视为undefined元素;.map/.filter不再保证回调执行顺序;协程默认不再支持 yield 数组(可用 coroutine.addYieldHandler 恢复);.any()/.some() 的拒绝原因从数组改为 AggregateError——后者实现在 src/errors.js#L28,是一个继承自 Error 并聚合了数组迭代方法的特殊错误类型。

2.1.x – 2.3.x:promisifier 选项、reflect 与绑定

  • 2.1.0Promise.promisifyAll()增加promisifier自定义选项,并提升 .props() 与集合方法在立即值场景的性能;
  • 2.3.0.bind() 与 Promise.bind 现在会等待thisArg(若是 promise/thenable)解析完成;
  • 2.3.1.using可混用不同 bluebird 副本创建的 disposer;
  • 2.3.6实现 .reflect();
  • 2.2.0.any/.some在输入过少时统一以RangeError拒绝。

2.4.x – 2.9.x:性能、promisifyAll 与调度器迭代

这段密集的补丁期基本奠定了 3.x 的工程基础:

  • 2.6.0(2015-01-06)宣称并行 promise 性能提升约 50%、内存占用减少约 50%(文档原文 "+50% faster, -50% less memory"),并伴随大量内部重构;
  • 2.8.0(2015-01-19)长堆栈(long stack traces)重新设计,更可读、更精简,并支持 IE10+;
  • 2.9.0新增Promise.fromNodePromise.bindvalue参数;2.9.7让 promisify 保留原函数自定义属性(从而可同时 promisifyrequest模块的导出函数及其方法),promisifyAll方法不再依赖this2.9.15增加.asCallback作为.nodeify别名;
  • 调度器(scheduler)长期斗争:2.9.14 固定使用process.nextTick,2.9.16 在有setImmediate时优先使用,2.9.27 修复sinon.useFakeTimers()破坏调度器的问题(#631),Promise.setScheduler 自 2.0 起对外开放;期间还修复了 2.9.4 中 .timeout() 未用正确句柄调用clearTimeout导致进程空等的回归;
  • 全局拒绝事件:2.7.0 实现 global rejection events(#428/#357),2.8.2 起在浏览器中同时以 DOM3 事件和 legacy 事件两种方式触发;配套 API 见 promise.onunhandledrejectionhandled 与 promise.onpossiblyunhandledrejection。

三、1.x 与 0.x:性能与调试的奠基

1.x 关键节点

  • 1.0.0(2014-01-12)集合方法不再跳过稀疏数组空洞(向后不兼容);reduce的迭代函数允许返回 promise/thenable;
  • 1.1.0实现 .tap() 与Promise.coroutine.addYieldHandler(),弃用Promise.prototype.spawn
  • 1.2.0新增 .value()、.reason() 与Promise.onUnhandledRejectionHandled()map/filter开始"尽早调用回调但保持正确顺序";
  • 1.0.5promisified 函数按最优顺序检查参数数量,且与原始函数.length相差 1(减去回调参数)。

0.x 早期:性能、调试与浏览器兼容

  • 0.9.x相继实现 .bind/Promise.bind(0.9.0)、Promise.race(0.9.9)、.props()(0.8.3)、Promise.method/.return/.throw(0.10.0)、Promise.resolve/reject/defer(0.10.1),并实现 RejectionError 包装与 .error() 方法(0.9.6);
  • 0.10.10浏览器默认关闭长堆栈,需显式调用Promise.longStackTraces()开启(文档);
  • 0.8.5支持通过BLUEBIRD_DEBUG环境变量开启进程级长堆栈;0.8.1移除了非必要的动态求值(new Function/eval),改用特性检测做静态求值,为 CSP 受限环境铺路;
  • 0.8.3支持 AMD 命名模块;0.7.10使测试通过 IE8 并创建浏览器测试体系;0.8.3-2允许以require("bluebird/zalgo")方式释放 Zalgo(同步回调)——这是唯一为"知情者"提供的同步捷径;
  • 0.11.6起 .filter 的 filterer 可返回 promise/thenable,.error()扩展为捕获来自Promise.reject、thenable reject、promisified errback、new Promise显式 reject 与PromiseResolver.reject等多类拒绝来源。

四、贯穿各版本的修复主线

纵向看,变更日志中的数百条修复可归纳为几条反复出现的工程主线,这对理解 Bluebird 的内部架构极有帮助:

1. 未处理拒绝(unhandled rejection)体系

从 1.0.x 的"按 promise 而非按 error 跟踪拒绝"、2.9.28 的"已处理拒绝被误报"、3.5.1 的 async/await 误报,到 3.6.0 对 .reduce/.map/.filter 虚假拒绝事件的一揽子修复,未处理拒绝的判定精度贯穿始终。相关行为在 test/mocha/unhandled_rejections.js 等测试中持续回归验证。

2. 取消与超时(cancellation & timeout)

.cancel() 与 .timeout() 的交互(父链传播、clearTimeout清理、与 .bind() 的配合)在 2.9.20、3.0.6、3.1.2、3.3.0、3.6.0 多次迭代,最终行为可参考 test/mocha/cancel.js 与 test/mocha/timers.js。

3. 长堆栈(long stack traces)

从 0.8.x 的环境变量开关、2.4.0 对 minified 文件内部帧的过滤、2.8.0 的重新设计(支持 IE10+)、3.4.7 的环境变量误触发修复,到 debuggability.js 中与asyncHooks选项的联动,调试能力是 Bluebird 区别于原生 Promise 的核心卖点之一。

4. 调度器(scheduler)演进

MutationObserver → setImmediate → process.nextTick → setTimeout的探测与回退策略贯穿 0.7.x 至 2.9.x 的十余条修复(Safari 6、NW、Chrome、Firefox、iOS 8.1 WebApp 各自踩过坑),最终收敛为 schedule.js 中按环境自适应的实现,并支持 Promise.setScheduler 自定义。

5. promisify / promisifyAll 演进

2.1.0 的promisifier选项、2.7.0 向自定义 promisifier 传入默认实现与passesDefaultFilter、2.9.7 的属性保留与this解耦、2.9.29 对类构造函数的识别、3.5.0 的 webpack 入口——promisify 的成熟过程体现了对真实生态(mongodb、request 等模块)的持续适配,详见 promisify.js。

6. 浏览器兼容性战场

IE8/IE9/IE10+、Firefox、Chrome、Safari、iOS WebApp、node-webkit、NW.js、PhantomJS、WebWorker、jsdom 等环境的专门修复在日志中反复出现,这也是 Bluebird 敢于在浏览器环境宣称可靠性的底气来源,相关构建与测试脚本见 tools/browser_test_runner.js 与 test/browser。

五、从变更日志看 Bluebird 的设计哲学

  • 性能是硬指标:从 0.7.x 起几乎每个版本都有"Improve performance"条目,2.6.0 的并行性能跃升与 0.8.1 的动态求值移除体现了"性能优先、安全兜底"的取舍;
  • 调试能力是一等公民:长堆栈、未处理拒绝、警告系统(含"遗忘返回语句"警告与 warning-explanations 文档)构成了完整的开发者体验闭环;
  • 激进演进 + 明确文档化:2.0 与 3.0 两次大版本均伴随明确的破坏性变更清单与迁移文档(new-in-bluebird-3、deferred-migration、progression-migration),小版本则严格遵守语义化版本节奏;
  • 生态务实主义:对 Promise/A+ 规范的逐条对齐(循环 thenable、2.3.2 adoption 顺序、自引用解析等)与对第三方库(sinon、request、mongodb、jsdom)现实问题的快速修补并行不悖。

源码索引

  • 版本元数据与库入口:src/promise.js(Promise.versionPromise.getNewLibraryCopy、AsyncResource 集成)
  • 集合与并发方法:src/map.js、src/each.js、src/filter.js、src/reduce.js、src/settle.js(Promise.allSettled)、src/some.js(AggregateError使用)
  • 取消/超时/绑定:src/cancel.js、src/timers.js、src/bind.js
  • promisify 与 node 互操作:src/promisify.js、src/nodeify.js
  • 调试与调度:src/debuggability.js、src/schedule.js、src/queue.js
  • 文档与测试:完整 API 见 docs/docs/api-reference.md,回归测试见 test/mocha 目录(如 unhandled_rejections.js、cancel.js、promisify.js),性能基准见 benchmark 目录与 docs/docs/benchmarks.md。
  • 后端

【免费下载链接】bluebird

:bird: :zap: Bluebird is a full featured promise library with unmatched performance.

项目地址:https://gitcode.com/gh_mirrors/bl/bluebird
点击查看免费下载
上一篇:零信任防护:Awesome AI Agents安全实践指南
下一篇:Wekan多项目管理终极指南:如何高效跟踪多个相关项目进展

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询