从异步等待函数获取Bluebird Promise

时间:2017-05-24 12:37:15

标签: node.js promise async-await bluebird es6-promise

我正在寻找一种方法,使用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返回的默认承诺,那么我好奇。似乎包含了构造函数:

  

请注意,AsyncFunction不是全局对象。可以通过评估以下代码来获得它。

     
Object.getPrototypeOf(async function(){}).constructor

MDN reference on AsyncFunction

如果无法更改AsyncFunction的Promise构造函数,我想知道这种锁定的原因。

谢谢!

1 个答案:

答案 0 :(得分:14)

  

有没有办法更改AsyncFunction返回的默认Promise

没有

  

这种锁定的原因是什么

劫持所有async function的能力可能是一个安全问题。而且,即使在没有问题的情况下,在全球范围内进行此替换仍然没有用。它会影响您的整个领域,包括您正在使用的所有库。他们可能依赖于使用原生承诺。并且您不能使用两个不同的promise库,尽管可能需要它们。

  

我希望能够做到这样的事情:

getResolvedAsyncAwaitPromise().tap(...)

可以做的是用Promise.method将函数包装在其定义中:

const Bluebird = require('Bluebird');
const getResolvedAsyncAwaitPromise = Bluebird.method(async () => 'value');

getResolvedAsyncAwaitPromise()
.tap(…) // Works!
.then(…);