美文网首页Nodejs学习笔记
Node.js中新的`util.promisify`

Node.js中新的`util.promisify`

作者: frankgo | 来源:发表于2019-01-23 10:54 被阅读1次

    快速搜索npmjs揭示了这个主题是如何成为JavaScript开发人员的核心。我曾经也有我的个人实用工具将Node.js基于回调的内部方法转换为返回承诺方法。

    所以我想这对于使用node的每个人来说都是一个很大的好消息:Node.js正在添加一个新的实用程序,它的核心就是这个util.promisify。

    如果您曾经使用过其中一个promisify模块,那么您将不会感到惊讶util.promisify; 他们几乎以同样的方式工作。

    util.promisify接受Node.js回调样式(err, value) => ...后的函数,即将错误优先回调作为最后一个参数,并返回返回promises的版本。

    但是你知道,代码片段胜过千言万语。

    假设我想读取文件的内容。fs.readFile是此作业的工具,但其实现目前仅适用于回调:

    const fs = require('fs');

    fs.readFile('./notes.txt', (err, txt) => {

      if (err) {

        throw new Error(err.message);

      }

      console.log(txt);

    });

    如果我想要以Promise为基础fs.readFile,我有两个选择; 从npm中选择其中一个模块,或手动编写我的承诺fs.readFile。在这里,我想要第二个选项,只是为了展示在promisifier函数的漂亮抽象下发生了什么。

    const fs = require('fs');

    exports = module.exports =

      (file, options) =>

        new Promise((res, rej) => {

          fs.readFile(file, options, (err, txt) => {

            if (err) {

              return rej(err.message);

            }

            res(txt);

          });

        });

    这非常简单,但它不能很好地扩展......如果我需要更多使用promises的函数,我将不会使用这种方法。

    我们可以考虑将承诺给定功能的能力提取到适当的效用中; 而这正是这些软件包的作者所做的......以及现在我们在核心中所拥有的东西,暴露为util.promisify。

    const fs = require('fs');

    const util = require('util');

    const readFile = util.promisify(fs.readFile);

    readFile('./notes.txt')

      .then(txt => console.log(txt));

    util.promisify即使使用不将错误优先(err, value) => ...回调作为最后一个参数的方法,最终也可以工作。让我们考虑一下fs.exists(它现在已被弃用)。

    fs.exists('/etc/passwd', (exists) => {

      console.log(exists ? 'it\'s there' : 'no passwd!');

    });

    使用util.promisify.custom符号可以覆盖返回值util.promisify。

    const fs = require('fs');

    const exists = (file) =>

      new Promise((res, rej) => {

        fs.access(file, (err) => {

          if (err) {

            if (err.code === 'ENOENT') {

              return res(false);

            }

            return rej(err);

          }

          res(true);

        });

      });

    fs.exists[util.promisify.custom] = exists;

    util.promisify(fs.exists) === exists; // true

    这些天有可能使用本机Promise特别令人兴奋,因为对async / await的支持开始蔓延。

    (async () => {

      const fs = require('fs');

      const util = require('util');

      const readFile = util.promisify(fs.readFile);

      const txt = await readFile('./notes.txt');

      console.log(txt);

    })();

    util.promisify计划首次发布,作为Node.js 8.0.0的第一个候选版本的一部分; 在这里你可以看到拉取请求进度,现在合并了。

    相关文章

      网友评论

        本文标题:Node.js中新的`util.promisify`

        本文链接:https://www.haomeiwen.com/subject/kskjjqtx.html