使用 Bluebird Promises 库

发布于 2022-07-14 13:21:37 字数 4109 浏览 257 评论 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技术交流群

发布评论

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

关于作者

0 文章
0 评论
23 人气
更多

推荐作者

末蓝

文章 0 评论 0

年少掌心

文章 0 评论 0

党海生

文章 0 评论 0

飞翔的企鹅

文章 0 评论 0

鹿港小镇

文章 0 评论 0

wookoon

文章 0 评论 0

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