Promisify函数

函数
promisify(fn, reverse)
  • fn <function> 有回调函数作为参数的函数
  • reverse <Boolean> 默认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一起返回,所以在获取结果时需要进行解构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值