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一起返回,所以在獲取結果時需要進行解構。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章