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其他类似文章!