使用async/await + Bluebird来promisifyAll

8 asynchronous node.js promise bluebird

我正在构建一个使用async/await的库,我想知道是否可以使用ass/await这样的本机模块.我知道async /等待它只是背景中的Promises,所以...有一种本地方式来宣传一个方法或函数吗?目前我正在使用蓝鸟,但我不知道这是不是一个糟糕的模式.例:

    const Bluebird = require("bluebird");
    const { access } = require("fs");

    const accessAsync = Bluebird.promisify(access);

    async function checkInput(options) {
      await accessAsync(options.file);
      /// etc
      return options;
    }

    module.exports = (options) => {
      Promise.resolve(options)
        .then(checkInput)
    };
Run Code Online (Sandbox Code Playgroud)

我正在结合原生的Promises和Bluebird.我应该只使用Bluebird吗?

谢谢.

rsp*_*rsp 7

我正在构建一个使用async/await的库,我想知道是否可以使用ass/await这样的本机模块.

是.使用Bluebird比使用示例更简单:

let fs = Promise.promisifyAll(require('fs'));

// and in async function:
let contents = await fs.readFileAsync('file.txt', 'utf-8');
Run Code Online (Sandbox Code Playgroud)

请注意,您需要Async在方法名称的末尾添加.

或者您可以使用该mz模块,而无需添加Async到方法中.看到:

您可以在需要时使用许多模块npm install mz- 例如,您可以require('mz/fs')立即让您使用fs返回承诺的模块版本而不是回调.结合异步等待它可以让你做以下事情:

let fs = require('mz/fs');

// and in async function:
let contents = await fs.readFile('file.txt', 'utf-8');
Run Code Online (Sandbox Code Playgroud)

上面的代码仍然是非阻塞的.

请参阅此答案,其中显示mzcrypto模块版本的示例并更详细地解释了它:

见例子:

let crypto = require('mz/crypto');

async function x() {
  let bytes = await crypto.randomBytes(4);
  console.log(bytes);
}
Run Code Online (Sandbox Code Playgroud)

您可以对许多其他模块执行相同的操作,包括:

  • child_process
  • crypto
  • dns
  • fs
  • readline
  • zlib

我知道async /等待它只是背景中的Promises,所以...有一种本地方式来宣传一个方法或函数吗?

不久Node将本地支持 - 请参阅PR#5020为Promises添加核心支持:

但在此期间你可以使用mz.

有关更多上下文,请参阅问题#7549 v1:执行没有回调的异步函数应该返回promises:

另请参阅Node的Promises工作组存储库:

更新:似乎上面提到的PR 5020不会很快登陆Node - 感谢Benjamin Gruenbaum在评论中指出它.因此,似乎使用Bluebird promisifypromisifyAll有用的mz模块将是使用Node的核心模块使用该语言的现代功能的唯一简单方法.幸运的是,它们运作良好,所以这不是一个大问题.