使用 Bluebird Promises 库

发布于 2022-07-14 13:21:37 字数 4109 浏览 276 评论 0

Bluebird 是一个流行的 JavaScript Promises 库。 它是 JavaScript 中原生 Promises 的直接实现方式 。

global.Promise = require('bluebird');

// Prints "42"
Promise.resolve(42).then(val => console.log(val));

为什么人们使用 Bluebird 而不是原生 Promise? 有2个原因:

1、性能:

早期的原生 Promise 实现很慢 - 下面的基准脚本显示创建原生 Promise 比在 Node.js 8 中创建 Bluebird Promise 慢 3 倍:

// global.Promise = require('bluebird');
const Benchmark = require('benchmark');

const suite = new Benchmark.Suite();

// add tests
suite.
  add('new promise', function() {
    return new Promise((resolve, reject) => {});
  }).
  on('cycle', function(event) {
    console.log(String(event.target));
  }).
  on('complete', function() {
    console.log('Fastest is ' + this.filter('fastest').map('name'));
  }).
  run();

下面是输出,首先是 Bluebird,然后是原生 Promise:

$ ~/Workspace/libs/node-v8.17.0-linux-x64/bin/node ./bluebird.js 
new promise x 36,846,162 ops/sec ±0.66% (95 runs sampled)
Fastest is new promise
$
$ ~/Workspace/libs/node-v8.17.0-linux-x64/bin/node ./bluebird.js 
new promise x 12,244,609 ops/sec ±1.80% (84 runs sampled)
Fastest is new promise

然而,在 Node.js 12.x 中,原生 Promise 比 Bluebird 快得多。

2. 长堆栈跟踪

Bluebird 内置了对 异步堆栈跟踪 。 例如,下面的脚本不会打印行 fn() 被称为:

Promise.resolve().
  then(fn).
  catch(err => console.log(err));

function fn() {
  return new Promise((resolve, reject) => {
    setImmediate(() => reject(new Error('Oops')));
  });
}

你得到以下输出:

$ node ./test
Error: Oops
    at Immediate.setImmediate [as _onImmediate] (/app/test.js:8:31)
    at runCallback (timers.js:705:18)
    at tryOnImmediate (timers.js:676:5)
    at processImmediate (timers.js:658:5)

但是使用 Bluebird,您可以启用长堆栈跟踪,如下所示。

global.Promise = require('bluebird');
global.Promise.config({ longStackTraces: true });

Promise.resolve().
  then(fn).
  catch(err => console.log(err));

function fn() {
  return new Promise((resolve, reject) => {
    setImmediate(() => reject(new Error('Oops')));
  });
}

运行上面的脚本会给你下面的堆栈跟踪,其中包括行号 fn()被称为:

$ node ./test
Error: Oops
    at Immediate.setImmediate [as _onImmediate] (/app/test.js:10:31)
From previous event:
    at fn (/app/test.js:9:10)
    at runCallback (timers.js:705:18)
    at tryOnImmediate (timers.js:676:5)
    at processImmediate (timers.js:658:5)
From previous event:
    at Object.<anonymous> (/app/test.js:5:3)
    at Module._compile (internal/modules/cjs/loader.js:778:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3)

与 Async/Await 集成

不幸的是,没有办法让 异步函数 返回 Bluebird 承诺。 即使你设置 global.Promise = require('bluebird');,异步函数仍将返回本机承诺。

const NativePromise = global.Promise;
global.Promise = require('bluebird');

async function run() { return 'Hello, World'; }

const p = run();
p instanceof NativePromise; // true
p instanceof global.Promise; // false

你应该使用 Bluebird 还是 Native Promises?

现实情况是,在 2020 年,大多数 JavaScript 应用程序都不会从使用 Bluebird 中获得太多好处。 在 Node.js 和现代浏览器中,Bluebird 不再具有优于原生 Promise 的显着性能优势——原生 Promise 实际上更快。 但是,Bluebird 可以成为确保您在旧浏览器或旧版本 Node.js 上获得一致性能的绝佳工具。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

文章
评论
27 人气
更多

推荐作者

李珊平

文章 0 评论 0

Quxin

文章 0 评论 0

范无咎

文章 0 评论 0

github_ZOJ2N8YxBm

文章 0 评论 0

若言

文章 0 评论 0

南…巷孤猫

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文