从异步等待函数中获取 Bluebird Promise
Posted
技术标签:
【中文标题】从异步等待函数中获取 Bluebird Promise【英文标题】:Get Bluebird Promise from async await functions 【发布时间】:2017-10-24 19:30:16 【问题描述】:我正在寻找一种方法,使用 Node v7.6 或更高版本,在调用异步函数时获得 Bluebird Promise(或任何非本地承诺)。
我可以这样做:
global.Promise = require('Bluebird'); // Or Q/When
var getResolvedPromise = () => Promise.resolve('value');
getResolvedPromise
.tap(...) // Bluebird method
.then(...);
请参阅:May I use global.Promise=require("bluebird")
我希望能够做类似的事情:
global.Promise = require('Bluebird'); // Or Q/When
var getResolvedAsyncAwaitPromise = async () => 'value';
getResolvedAsyncAwaitPromise()
.tap(...) // Error ! Native Promises does not have `.tap(...)`
.then(...);
我知道我可以随时使用类似的东西:
Bluebird.resolve(getResolvedAsyncAwaitPromise())
.tap(...);
但我好奇是否有办法更改AsyncFunction
返回的默认 Promise。构造函数似乎是封闭的:
请注意,AsyncFunction 不是全局对象。它可以通过评估以下代码获得。
Object.getPrototypeOf(async function()).constructor
MDN reference on AsyncFunction
如果没有办法改变AsyncFunction
的Promise构造函数,我想知道这个锁定的原因。
谢谢!
【问题讨论】:
不,这是不可能的。如果是这样,那将意味着您将全局覆盖 Promise 实现,这是一场噩梦。 【参考方案1】:有没有办法改变 AsyncFunction 返回的默认 Promise
没有。
这种锁定的原因是什么
劫持所有async function
s 的能力可能是一个安全问题。此外,即使这没有问题,在全球范围内进行这种替换仍然没有用。它会影响您的整个领域,包括您正在使用的所有库。他们可能依赖于使用原生承诺。而且您不能使用两个不同的 Promise 库,尽管它们可能是必需的。
我希望能够做类似的事情:
getResolvedAsyncAwaitPromise().tap(...)
你可以做的是用Promise.method
包装函数的定义:
const Bluebird = require('Bluebird');
const getResolvedAsyncAwaitPromise = Bluebird.method(async () => 'value');
getResolvedAsyncAwaitPromise()
.tap(…) // Works!
.then(…);
【讨论】:
>Also, even where that is no problem, it's still not useful to do this replacement globally
— 不正确,它很有用,因为 node.js has very ugly stack traces for async/await calls。如果可以替换,那么有人可以将 Promise 实现替换为 Bluebird 并获得有用的堆栈跟踪。以上是关于从异步等待函数中获取 Bluebird Promise的主要内容,如果未能解决你的问题,请参考以下文章