资讯专栏INFORMATION COLUMN

[译] Node.js 8: util.promisify()

Shimmer / 2853人阅读

摘要:例如,的回调函数包含下面几个参数转换成之后,它的参数将会变成这样一个对象通过内部符号处理非标准回调函数。

Nodejs 8 有一个新的工具函数 util.promisify()。他将一个接收回调函数参数的函数转换成一个返回Promise的函数。

1、util.promisify()小例子

如果你给以下命令传入文件路径,则会输出文件内容

// echo.js

const {promisify} = require("util");

const fs = require("fs");
const readFileAsync = promisify(fs.readFile); // (A)

const filePath = process.argv[2];

readFileAsync(filePath, {encoding: "utf8"})
  .then((text) => {
      console.log("CONTENT:", text);
  })
  .catch((err) => {
      console.log("ERROR:", err);
  });

注意:在第一行,程序使用promisify()转换基于回调函数的方法fs.readFile()成一个返回promise的一个函数

下面的代码片段显示这个脚本如何使用的

$ node echo.js echo.js
CONTENT: const {promisify} = require("util");
···

$ node echo.js unknown.txt
ERROR: { Error: ENOENT: no such file or directory, ··· }
2、使用async函数

同样的功能,但是通过async函数实现

// echoa.js

const {promisify} = require("util");

const fs = require("fs");
const readFileAsync = promisify(fs.readFile);

const filePath = process.argv[2];

async function main() {
    try {
        const text = await readFileAsync(filePath, {encoding: "utf8"});
        console.log("CONTENT:", text);
    }
    catch (err) {
        console.log("ERROR:", err);
    }
}
main();
3、转换有多个参数的回调函数为Promise

下面的函数的回调函数接收多于一个的参数(除了error参数)

child_process.exec

child_process.execFile

dns.lookup

dns.lookupService

fs.read

fs.write

如果你转换这些函数为promise,它会返回一个对象(由多个参数组成的对象,而不是一个值)。例如,dns.lookup的回调函数包含下面几个参数

err : Error

address : string

family : integer

转换成Promise之后,它的参数将会变成{address, family}这样一个对象

const util = require("util");
const dns = require("dns");
const lookupAsync = util.promisify(dns.lookup);

lookupAsync("nodejs.org")
    .then(obj => console.log(obj));
    // { address: "104.20.23.46", family: 4 }

promisify()通过内部符号internal/util/customPromisifyArgs处理非标准回调函数。因此不推荐传入一个非标准的回调函数,也不应该去转换我们自己实现的回调(ps:自己就直接写Promise就好了。。。)

4、定制的Promise函数

promisified的API来源于util.promisify.custom,它允许您将一个promisified版本附加到一个基于回调的函数。 在以下示例中,fooAsyncfoopromisified版本

const util = require("util");

function foo() {
    return "abc";
}
async function fooAsync() {
    return "abc";
}
foo[util.promisify.custom] = fooAsync;

console.log(util.promisify(foo) === fooAsync); // true
4.1 定制了promisified版本的标准函数

现在,有两个标准函数有定制的promisified版本

> setImmediate[util.promisify.custom]
[Function]
> setTimeout[util.promisify.custom]
[Function]
5、低版本node兼容库

Jordan Harband写了一个库a polyfill for util.promisify(),用来兼容promisify,使用方法如下

需要注意:

js必须支持es5以上语法

必须支持Promise

待完善中

安装

npm install util.promisify

使用方式有两种

第一种,检查是否有内置实现(Node 8)或者使用 polyfill (旧的Node版本)

const promisify = require("util.promisify");

const fs = require("fs");
const readFileAsync = promisify(fs.readFile);

第二种,在旧版本的Node上使用补丁模块

const util = require("util");
require("util.promisify").shim();

const fs = require("fs");
const readFileAsync = util.promisify(fs.readFile);

翻译自 Node.js 8: util.promisify()

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/87044.html

相关文章

  • Node.js 8 中的 `util.promisify`

    摘要:我们就可以升级以前所有的异步回调函数了。大体上来说,这套方案通过使用回调实例包裹原先的回调函数,可以将原先复杂的嵌套展开铺平,从而降低开发和维护的难度和成本。 Node.js 8 于上个月月底正式发布,带来了很多新特性。其中比较值得注意的,便有 util.promisify() 这个方法。 如果你已经很熟悉 Promise,请继续往下看。如果你还不熟悉 Promise,可以先跳过去看下...

    HackerShell 评论0 收藏0
  • util.promisify 的那些事儿

    摘要:自定义的化有那么一些场景,是不能够直接使用来进行转换的,有大概这么两种情况没有遵循约定的回调函数返回多个参数的回调函数首先是第一个,如果没有遵循我们的约定,很可能导致的误判,得不到正确的反馈。 util.promisify是在node.js 8.x版本中新增的一个工具,用于将老式的Error first callback转换为Promise对象,让老项目改造变得更为轻松。 在官方推...

    shuibo 评论0 收藏0
  • Node.js 前端开发指南

    摘要:定时器在和浏览器中的表现形式是相同的。关于定时器的一个重要的事情是,我们提供的延迟不代表在这个时间之后回调就会被执行。它的真正含义是,一旦主线程完成所有操作包括微任务并且没有其它具有更高优先级的定时器,将在此时间之后执行回调。 众成翻译 原文链接 关于作者 2018年6月21日出版​ 本指南面向了解Javascript但尚未十分熟悉Node.js的前端开发人员。我这里不专注于语言本身...

    CntChen 评论0 收藏0
  • Node】搭建一个静态资源服务器

    摘要:一个包括文件缓存传输压缩模版引擎类型匹配等功能的静态资源服务器,使用的内置模块实现,可以通过链接访问资源。二使用读取资源文件我们的目的是搭建一个静态资源服务器,当访问一个到资源文件或目录时,我们希望可以得到它。 一个包括文件缓存、传输压缩、ejs 模版引擎、MIME 类型匹配等功能的 Node 静态资源服务器,使用 Node 的内置模块实现,可以通过链接访问资源。 一、创建 HTTP Se...

    Mr_houzi 评论0 收藏0
  • 现代JS中的流程控制:详解Callbacks 、Promises 、Async/Await

    摘要:控制台将显示回调地狱通常,回调只能由一个异步函数调用。更多资源使更友好规范使用异步函数简化异步编码旅程异步编程是一项在中无法避免的挑战。 JavaScript经常声称是_异步_。那是什么意思?它如何影响发展?近年来这种方法有何变化? 请思考以下代码: result1 = doSomething1(); result2 = doSomething2(result1); 大多数语言都处理每...

    shadowbook 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<