Skip to content
大纲

实现函数 promisify

promisifynodeutils 模块中的一个函数,它作用就是为了转换最后一个参数是回调函数的函数为 promise 函数,且回调函数中有两个参数:errordata

一般用法

js
const util = require('node:util')
const fs = require('node:fs')

const stat = util.promisify(fs.stat)
stat('.')
  .then((stats) => {
    // Do something with `stats`
  })
  .catch((error) => {
    // Handle the error.
  })

手写实现

这里是一个简单的实现,还可以参考 es6-promisify

js
// const newFn = myPromisify(fn)
// newFn(a) 会执行 Promise 参数方法
const myPromisify = (fn) => {
  // 返回一个包装函数
  return function (...args) {
    return new Promise((resolve, reject) => {
      // 添加回调
      args.push(function callback(err, ...values) {
        if (err) {
          return reject(err)
        }

        if (!values.length === 1) {
          return resolve(values[0])
        }

        // 多个参数时,
        // 这里 es6-promisify 中有 customArgumentsToken,
        // 可转为使用对应 key 的对象格式的参数
        resolve(values)
      })

      // 函数真正的执行的地方
      fn.apply(this, args)
    })
  }
}

// testing