函数
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一起返回,所以在获取结果时需要进行解构。