Promisify函数

函数

promisify(fn, reverse)

  • fn 有回调函数作为参数的函数
  • reverse 默认False。当fn的回调函数参数在前时(如setTimeout),设为True。

源码

function promisify(fn, reverse) {
  if ({}.toString.call(fn) !== '[object Function]') throw new TypeError('Only normal function can be promisified');
  return function (...args) {
    return new Promise((resolve, reject) => {
      const callback = function (...args) {
        if ({}.toString.call(args[0]) === '[object Error]') return reject(args[0]);
        resolve(args);
      };
      try {
        if (reverse === true) fn.apply(null, [callback, ...args]);
        else fn.apply(null, [...args, callback]);
      } catch (err) {
        reject(err);
      }
    });
  }
}

测试

const lstat = promisify(fs.lstat);
lstat('./index1.js')
  .then(([err, stats]) => {
    console.log({err, stats})
  })
  .catch(err => console.warn('Catch error:', err));

const wait = promisify(setTimeout, true);
wait(1000).then(() => console.log('1秒后打印');

说明

传入函数的回调函数中,若回调函数的第一个参数为Error对象,视为异常,装饰得到的函数会抛出Rejection。
网上有的promisify()里,直接将回调函数的首个参数,视为err,只resolve其他参数,这样处理会使一些非规范格式的函数无法使用。此处将err一起返回,所以在获取结果时需要进行解构。

你可能感兴趣的:(javascript,异常,经验技巧)