作用是:将回调的形式api转成promise形式来调用。
虽然 Promise 已经普及,但是 Node.js 里仍然有大量的依赖回调的异步函数,如果我们每个函数都封装一次,也是齁麻烦齁麻烦的,比齁还麻烦。所以 Node8 就提供了 util.promisify() 这个方法,方便我们快捷的把原来的异步回调方法改成返回 Promise 实例的方法
回调形式的api必须是最后一个参数是回调,形式如:(err,data)=>{}
这样的处理函数才行。
我们写一个异步回调形式的处理函数:(传入hhh为成功态,传入其他值为失败态)
function doSomething(thing, callback) {
setTimeout(() => {
if (thing === 'hhh') {
callback(undefined, thing)
} else {
callback('error!!', undefined)
}
}, 1000)
}
//我们设计的回调api的传入的回调函数必须是: (err, data) =>{}
doSomething('hhh', (err, data) => console.log(err, data))
//undefined hhh
此时我们就可以使用Node提供的util.promisify
对异步回调形式的方法进行包裹:
const { promisify } = require('util')
const promisifyDoSomethine = promisify(doSomething)//上面的doSomething方法
promisifyDoSomethine('zzz')
.then((res) => console.log('then:', res))
.catch((err) => console.log('catch:', err))
//catch: error!!
promisifyDoSomethine('hhh')
.then((res) => console.log('then:', res))
.catch((err) => console.log('catch:', err))
//then: hhh
手写一个promisify
const myPromisify = (func) => {
return (...args) => {//使用闭包,不让func被垃圾回收
return new Promise((resolve, reject) => {
func(...args, (err, data) => {
//promise的形式手动处理结果
if (err) {
reject(err)
return
}
resolve(data)
})
})
}
}
//验证:
const myPromisifyDoSomethine = myPromisify(doSomething)
myPromisifyDoSomethine('hhh')
.then((res) => console.log('then:', res))
.catch((err) => console.log('catch:', err))
//then: hhh
myPromisifyDoSomethine('zzz')
.then((res) => console.log('then:', res))
.catch((err) => console.log('catch:', err))
//catch: error!!