我正在构建一个使用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 installmz-例如,您可以
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将以本机方式支持它-请参阅 PR#5020为Promises添加Core支持 :
- https://github.com/nodejs/node/pull/5020
但在此期间您可以使用
mz。
有关更多上下文,另请参见 问题#7549 v1:执行不带回调的异步函数应返回promises :
- 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的核心模块一起使用的唯一简便方法。幸运的是,它们工作得很好,所以这不是一个大问题。



