首页 文章

从异步等待函数获取Bluebird Promise

提问于
浏览
9

我正在寻找一种方法,使用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(...);

I know I can use at any moment something like:

Bluebird.resolve(getResolvedAsyncAwaitPromise())
  .tap(...);

但我很好奇是否有办法改变 AsyncFunction 返回的默认Promise . 似乎包含了构造函数:

请注意,AsyncFunction不是全局对象 . 它可以通过评估以下代码获得 . Object.getPrototypeOf(async function(){}) . 构造函数

MDN reference on AsyncFunction

如果没有办法改变 AsyncFunction 的Promise构造函数,我想知道这种锁定的原因 .

谢谢 !

1 回答

  • 13

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

    没有 .

    这种锁定的原因是什么?

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

    我希望能够做类似的事情:getResolvedAsyncAwaitPromise() . tap(...)

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

    const Bluebird = require('Bluebird');
    const getResolvedAsyncAwaitPromise = Bluebird.method(async () => 'value');
    
    getResolvedAsyncAwaitPromise()
    .tap(…) // Works!
    .then(…);
    

相关问题