Node

lxf2023-03-11 08:44:01

Node

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()方式的具体内容,大量欢迎关注AdminJS其他类似文章!