使用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的promisifypromisifyAll和有用的mz模块将是使用Node的核心模块的语言的现代特征的唯一简单的方法。 幸运的是,它们工作得很好,所以这不是一个大问题。

使用蓝鸟以及诺言只会增加你的头脑。 意味着蓝鸟足以应付其他的承诺。

谢谢

通过一切手段,蓝鸟被devise为与本地的承诺。 您所描述的用例不仅被支持 – 而且是Bluebird的devise目标。

蓝鸟的承诺遵循Promise / A +规范,保证与await 。 更重要的是,你可以将本地承诺传递给蓝鸟,它会工作得很好。