利用闭包与代理的特性,将目标函数转化为promise对象。
function promisify(target, ctx = null) {
if (typeof target !== "function") {
throw TypeError(
`Expected target function. Received ${getType(target)}`
)
}
return function(...args) {
ctx || (ctx = this)
return new Promise((resolve, reject) => {
const fulfill = (err, res) => err ? reject(err) : resolve(res)
target.call(ctx, ...args, fulfill)
})
}
}
参考:https://github.com/octet-stream/promisify/blob/master/promisify.js