作用是:将回调的形式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!!
Last Updated: 8/1/2021, 1:43:20 PM