使用 Bluebird Promises 库
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论