返回顶部
首页 > 资讯 > 前端开发 > html >Node.js中util模块的promisify()方法怎么用
  • 554
分享到

Node.js中util模块的promisify()方法怎么用

2024-04-02 19:04:59 554人浏览 泡泡鱼
摘要

这篇文章主要介绍了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()方法怎么用”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网html频道,更多相关知识等着你来学习!

--结束END--

本文标题: Node.js中util模块的promisify()方法怎么用

本文链接: https://lsjlt.com/news/79693.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Node.js中util模块的promisify()方法怎么用
    这篇文章主要介绍了Node.js中util模块的promisify()方法怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 ...
    99+
    2024-04-02
  • Node.js中如何使用util模块
    本篇文章为大家展示了Node.js中如何使用util模块,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。util.inheritsuitl.inherits(cons...
    99+
    2024-04-02
  • 如何理解node.js中Util模块作用
    这篇文章给大家介绍如何理解node.js中Util模块作用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。从类型判断说起在 JavaScript 中,进行变量的类型校验是一个非常令人头疼的事,如果只是简单的使用 ...
    99+
    2023-06-21
  • node.js中Util模块作用教程示例详解
    目录从类型判断说起严格相等Error First & Promise调试与输出从类型判断说起 在 JavaScript 中,进行变量的类型校验是一个非常令人头疼的事,如果只是...
    99+
    2024-04-02
  • Node.js中fs模块的使用方法
    引入fs模块 var fs=require('fs'); 1. fs.stat检测是文件还是目录 fs.stat('html/style.css', function (err, s...
    99+
    2024-04-02
  • Node.js中path模块,url模块,http模块怎么用
    小编给大家分享一下Node.js中path模块,url模块,http模块怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!path模块Node.js中,提供了一...
    99+
    2023-06-29
  • Node.js中的模块化方法是什么
    今天给大家介绍一下Node.js中的模块化方法是什么。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。一、模块化的基本概念1、什么是模块化模块化是指解决一个复杂问...
    99+
    2023-06-26
  • Node.js中的path模块怎么用
    这篇文章主要介绍“Node.js中的path模块怎么用”,在日常操作中,相信很多人在Node.js中的path模块怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Node...
    99+
    2024-04-02
  • Node.js 中的 fs 模块与Path模块方法详解
    概述: 文件系统模块是一个简单包装的标准 POSIX 文件 I/O 操作方法集。可以通过调用 require("fs") 来获取该模块。文件系统模块中的所有方法均有异步和同步版本。...
    99+
    2024-04-02
  • Node.js中stream模块怎么用
    这篇文章主要介绍了Node.js中stream模块怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Node.js 流的类型Node.js...
    99+
    2024-04-02
  • Node.js中url模块怎么用
    这篇文章给大家分享的是有关Node.js中url模块怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。url模块URL模块主要提供对URL(Uniform Resource L...
    99+
    2024-04-02
  • 详解Node.js中的模块化方法
    目录一、模块化的基本概念1、什么是模块化2、模块化规范二、Node.js 中的模块化1、Node.js 中的模块化分类2、加载模块3、向外共享模块作用域中的成员4、Node.js 中...
    99+
    2024-04-02
  • Node.js中对通用模块的封装方法
    在Node.js中对模块载入和执行进行了包装,使得模块文件中的变量在一个闭包中,不会污染全局变量,和他人冲突。 前端模块通常是我们开发人员为了避免和他人冲突才把模块代码放置在一个闭包中。 如何封装Node....
    99+
    2022-06-04
    中对 模块 方法
  • Node.js中的VM模块怎么使用
    本篇内容主要讲解“Node.js中的VM模块怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.js中的VM模块怎么使用”吧!参考文献 vm 虚拟机...
    99+
    2024-04-02
  • Node.js中的http模块怎么使用
    本篇内容介绍了“Node.js中的http模块怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、什...
    99+
    2024-04-02
  • Node.js中的EventEmitter模块怎么使用
    本篇内容主要讲解“Node.js中的EventEmitter模块怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.js中的EventEmitter...
    99+
    2024-04-02
  • Node.js中的内置模块怎么用
    这篇“Node.js中的内置模块怎么用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Node.js中的内置模块怎么用”文章吧...
    99+
    2023-06-17
  • Node.js中的path模块怎么使用
    这篇“Node.js中的path模块怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Node.js中的path模块怎么...
    99+
    2023-07-05
  • node.js中优雅的使用Socket.IO模块的方法
    目录前言Socket.IO的定义Socket.IO的优点node中安装Socket.IOnode中使用Socket.IOemiton在express中引入使用服务端客户端小结前言 上...
    99+
    2022-12-08
    node.js使用Socket.IO模块 node.js Socket.IO
  • Node.js中SerialPort模块怎么使用
    这篇文章主要讲解了“Node.js中SerialPort模块怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Node.js中SerialPort模块怎么使用”吧!目的上位机与各种电路模...
    99+
    2023-06-21
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作