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