深入了解Node.js util模块的promisify()方法

深入了解Node.js util模块的promisify()方法

Node.js 内置的 util 模块有一个 promisify() 方法,该方法将基于回调的函数转换为基于 Promise 的函数。这使您可以将 Promise 链和 async/await 与基于回调的 API 结合使用。

例如,Node.js 的 fs 模块在读取文件时,需要使用回调:

const fs = require('fs')fs.readFile('./package.json', function callback(err, buf) {  const obj = JSON.parse(buf.toString('utf8'))  console.log(obj.name) // 'Example' -> package.json 包名})

登录后复制

我们可以使用 util.promisify() 将 fs.readFile() 的回调函数转换为返回 Promise 函数:

const fs = require('fs')const util = require('util')// 将 fs.readFile() 转换为一个接受相同参数但返回 Promise 的函数。const readFile = util.promisify(fs.readFile)// 现在可以将 readFile() 与 await 一起使用!const buf = await readFile('./package.json')const obj = JSON.parse(buf.toString('utf8'))console.log(obj.name) // 'Example'

登录后复制

promisify 是如何工作的?

util.promisify() 在后台是如何工作的?npm 上有一个 polyfill,您可以在这里阅读完整的实现。您也可以在这里找到 Node.js 的实现,不过为了便于理解,polyfill 更易于阅读。【推荐学习:《nodejs 教程》】

util.promisify() 背后的关键思想是向传入的参数添加回调函数。该回调函数解析或拒绝 promisified 函数返回的 Promise。

为了便于理解,下面是一个非常简化的 util.promisify() 自定义实现示例:

const fs = require('fs')// util.promisify() 的简化实现。不包括所有情况,不要在 prod 环境中使用此选项!function promisify(fn) {  return function() {    const args = Array.prototype.slice.call(arguments)    return new Promise((resolve, reject) => {      fn.apply(this, [].concat(args).concat([(err, res) => {        if (err != null) {          return reject(err)        }        resolve(res)      }]))    })  }}// 将 fs.readFile() 转换为一个接受相同参数但返回 Promise 的函数。const readFile = promisify(fs.readFile)// 现在可以将 readFile() 与 await 一起使用!const buf = await readFile('./package.json')const obj = JSON.parse(buf.toString('utf8'))console.log(obj.name) // 'Example'

登录后复制

那么这是什么意思呢?首先,util.promisify()向传入的参数添加 1 个额外参数,然后使用这些新参数调用原始函数。这意味着底层函数需要支持该数量的参数。因此,如果您要调用myFn()具有 2 个类型参数的promisified 函数 [String, Object],请确保原始函数支持[String, Object, Function]。

那么这意味着什么呢?首先,util.promisify() 向传入的参数添加一个额外参数,然后使用这些新参数调用原始函数。这意味着基础函数需要支持该数量的参数。因此,如果您使用 [String, Object] 类型的 2 个参数调用 promisified 函数 myFn(),请确保原始函数支持 [String, Object, Function]。

其次,util.promisify() 对函数上下文(this)有影响。

丢失上下文

丢失上下文(this)意味着函数调用以错误的值结束。丢失上下文是转换函数的常见问题:

class MyClass {  myCallbackFn(cb) {    cb(null, this)  }}const obj = new MyClass()const promisified = require('util').promisify(obj.myCallbackFn)const context = await promisified()console.log(context) // 打印 undefined 而不是 MyClass 实例!

登录后复制

请记住,this 包含函数被调用时的属性的任何对象。因此,您可以通过将 promisified 函数设置为同一对象的属性来保留上下文:

class MyClass {  myCallbackFn(cb) {    cb(null, this)  }}const obj = new MyClass()// 保留上下文,因为 promisified 是 obj 的属性obj.promisified = require('util').promisify(obj.myCallbackFn)const context = await obj.promisified()console.log(context === obj) // true

登录后复制

更多编程相关知识,请访问:编程视频!!

以上就是深入了解Node.js util模块的promisify()方法的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2708531.html

(0)
上一篇 2025年3月7日 20:22:31
下一篇 2025年3月5日 18:51:42

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 快速了解nodejs项目中如何增删改查文件

    这篇文章主要是写给初学node.js的同学,本篇文章主要姐介绍nodejs的文件模块,通过nodejs的文件模块,我们可以创建、读取、修改、删除我们操作系统上的文件或文件夹,同理在Linux服务器上也是可以运行的。因为nodejs是跨平台运…

    2025年3月7日
    200
  • nodejs 如何加密

    nodejs加密的方法:1、导入crypto模块;2、设置加密类型和要使用的加密密钥;3、将编码方式从utf-8转为hex;4、返回加密后的字符串即可。 本文操作环境:windows7系统、nodejs10.16.2版,DELL G3电脑。…

    2025年3月7日
    200
  • mac如何安装nodejs

    mac安装nodejs的方法:1、在官方下载网站下载pkg安装包,直接点击安装;2、使用“brew install node”命令来安装即可。 本文操作环境:macOS10.15系统、nodejs10.16.2版,MacBook Air 2…

    2025年3月7日
    200
  • 浅谈nodejs中怎么对字符串进行Base64编码和解码

    什么是base64编码?base64是如何工作的?下面本篇文章给大家介绍一下使用node.js对字符串进行 base64编码和解码的方法,希望对大家有所帮助! 什么是 Base64 编码? Base64 编码是一种将数据(通常是二进制)转换…

    2025年3月7日
    200
  • 怎么查看nodejs安装路径

    查看nodejs安装路径的两种方法:1、打开cmd命令行窗口,输入“where node”命令并回车即可输出nodejs的安装路径。2、打开“开始”菜单,找到并右击“Node.js”程序,在弹出菜单中点击“打开文件位置”即可查看安装路径。 …

    2025年3月7日 编程技术
    200
  • 怎么彻底删除nodejs

    彻底删除nodejs的方法:1、从卸载程序中卸载;2、从任务管理器中杀死所有与节点相关的进程;3、检查“%PATH%”环境变量;4、在命令提示符下输入where node并删除即可。 本文操作环境:Windows7系统、nodejs10.1…

    2025年3月7日
    200
  • 深入了解Node.js中的四大流,解决“背压”问题

    node.js的4种stream是什么?什么是背压问题?下面本篇文章就来带大家了解一下node.js中的四大流(stream),介绍一下背压问题和解决方法,希望对大家有所帮助! 把一个东西从 A 搬到 B 该怎么搬呢? 抬起来,移动到目的地…

    2025年3月7日 编程技术
    200
  • 一文快速了解Nodejs中的模块系统

    本篇文章带大家了解一下nodejs中的模块系统,希望对大家有所帮助! 模块化的背景 早期 JavaScript 是为了实现简单的页面交互逻辑, 但随着时代发展, 浏览器不单单仅只能呈现简单交互, 各种各样的网站开始大放光彩。随着网站开始变得…

    2025年3月7日
    200
  • linux 命令怎么安装nodejs

    linux命令安装nodejs的方法:1、选择一个合适的nodejs版本下载;2、通过“tar -xvf node-v10.6.0-linux-x64.tar.xz”命令将安装包上传到指定位置即可。 本文操作环境:linux5.9.8系统、…

    2025年3月7日
    200
  • nodejs怎么更改路径

    nodejs更改路径的方法:1、在安装目录下新建node_global等文件夹;2、在cmd窗口下执行“npm install gulp -g”命令;3、在环境变量配置的用户变量中增加一个配置即可。 本文操作环境:windows7系统、no…

    2025年3月7日
    200

发表回复

登录后才能评论