使用异步/等待+蓝鸟来PromisifyAll

我正在构建一个使用的库,async/await我想知道是否可以将本机模块与fs一起使用async/await。我知道async/await这只是背景中的Promises,所以有本机的方法来实现方法或功能的实现吗?目前,我正在使用Bluebird,但我不知道这是否是一个坏模式。

例:

    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)

};

我将原生Promises和Bluebird结合在一起。我应该只使用Bluebird吗?

回答:

我正在构建一个使用async / await的库,我想知道是否可以在async / await中使用诸如fs之类的本机模块。

是。使用Bluebird可以比示例更简单:

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

// and in async function:

let contents = await fs.readFileAsync('file.txt', 'utf-8');

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

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

  • https://www.npmjs.com/package/mz

一次使用后,您可能需要许多模块npm install

mz-例如,您可以require('mz/fs')使用它,并且它立即使您可以使用fs返回promise 的模块版本,而不是进行回调。与async

await结合使用,您可以执行以下操作:

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

// and in async function:

let contents = await fs.readFile('file.txt', 'utf-8');

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

请参阅以下答案,在此我将显示模块mz版本的示例crypto并对其进行更详细的说明:

参见示例:

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

async function x() {

let bytes = await crypto.randomBytes(4);

console.log(bytes);

}

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

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

我知道async / await只是在后台执行Promises,所以…是否有一种本机的方法来实现方法或功能的实现?

很快,Node将以本机方式支持它-请参阅 :

  • https://github.com/nodejs/node/pull/5020

但在此期间您可以使用mz

有关更多上下文,另请参见 :

  • https://github.com/nodejs/node-v0.x-archive/issues/7549

另请参阅节点的 :

  • https://github.com/nodejs/promises

似乎上述PR 5020不会很快降落在Node上,这要感谢Benjamin

Gruenbaum在评论中指出。因此,似乎使用Bluebird的promisifypromisifyAll有用的mz模块将是将语言的现代功能与Node的核心模块一起使用的唯一简便方法。幸运的是,它们工作得很好,所以这不是一个大问题。

以上是 使用异步/等待+蓝鸟来PromisifyAll 的全部内容, 来源链接: utcz.com/qa/408152.html

回到顶部