从异步等待函数中获取 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 functions 的能力可能是一个安全问题。此外,即使这没有问题,在全球范围内进行这种替换仍然没有用。它会影响您的整个领域,包括您正在使用的所有库。他们可能依赖于使用原生承诺。而且您不能使用两个不同的 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的主要内容,如果未能解决你的问题,请参考以下文章

无法从异步函数获取返回值,等待未按预期工作(Vue API 服务)

NodeJS,从异步等待中获取返回值

NPM CI 和 Bluebird 承诺警告

如何等待异步函数执行?

异步/等待/然后在 Dart/Flutter 中

promise