使用异步/等待+蓝鸟来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的promisify
和promisifyAll
有用的mz
模块将是将语言的现代功能与Node的核心模块一起使用的唯一简便方法。幸运的是,它们工作得很好,所以这不是一个大问题。
以上是 使用异步/等待+蓝鸟来PromisifyAll 的全部内容, 来源链接: utcz.com/qa/408152.html