使用async / await + Bluebird来promisifyAll
我正在构build一个使用async / await的库,我想知道是否有可能像使用async / await一样使用fs这样的本地模块。 我知道asynchronous/等待它只是在后台承诺,所以…是否有本地方式promisify一个方法或function? 目前,我正在使用蓝鸟,但我不知道这是不是一个坏模式。 例:
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。 我应该只使用蓝鸟吗?
谢谢。
我正在构build一个使用async / await的库,我想知道是否有可能像使用async / await一样使用fs这样的本地模块。
是。 蓝鸟比你的例子更简单:
let fs = Promise.promisifyAll(require('fs')); // and in async function: let contents = await fs.readFileAsync('file.txt', 'utf-8');
请注意,您需要在方法名称末尾添加Async
。
或者你可以使用mz
模块,而不需要为方法添加Async
。 看到:
一旦你npm install mz
,有很多模块你可以要求 – 例如你可以require('mz/fs')
,它立即允许你使用返回promise而不是callback的fs
模块版本。 结合asynchronous等待它可以让你做这样的事情:
let fs = require('mz/fs'); // and in async function: let contents = await fs.readFile('file.txt', 'utf-8');
上面的代码仍然是非阻塞的。
看到这个答案,我展示了一个crypto
模块的mz
版本的例子,并更详细地解释它:
- 哪些函数可以在node.js中同步工作?
看例子:
let crypto = require('mz/crypto'); async function x() { let bytes = await crypto.randomBytes(4); console.log(bytes); }
您可以对许多其他模块执行相同的操作,其中包括:
-
child_process
-
crypto
-
dns
-
fs
-
readline
-
zlib
我知道asynchronous/等待它只是在后台承诺,所以…是否有本地方式promisify方法或function?
不久,Node会自然支持 – 参见PR#5020增加对Promise的核心支持 :
但在此期间,你可以使用mz
。
有关更多上下文,请参阅Issue#7549 v1:执行不带callback的asynchronous函数应该返回promise :
另请参阅节点的承诺工作组信息库 :
更新:上面提到的PR 5020似乎不会很快在Node上着陆 – 感谢Benjamin Gruenbaum在评论中指出。 所以看起来,使用Bluebird的promisify
和promisifyAll
和有用的mz
模块将是使用Node的核心模块的语言的现代特征的唯一简单的方法。 幸运的是,它们工作得很好,所以这不是一个大问题。
使用蓝鸟以及诺言只会增加你的头脑。 意味着蓝鸟足以应付其他的承诺。
谢谢
通过一切手段,蓝鸟被devise为与本地的承诺。 您所描述的用例不仅被支持 – 而且是Bluebird的devise目标。
蓝鸟的承诺遵循Promise / A +规范,保证与await
。 更重要的是,你可以将本地承诺传递给蓝鸟,它会工作得很好。