利用闭包与代理的特性,将目标函数转化为promise对象。

    1. function promisify(target, ctx = null) {
    2. if (typeof target !== "function") {
    3. throw TypeError(
    4. `Expected target function. Received ${getType(target)}`
    5. )
    6. }
    7. return function(...args) {
    8. ctx || (ctx = this)
    9. return new Promise((resolve, reject) => {
    10. const fulfill = (err, res) => err ? reject(err) : resolve(res)
    11. target.call(ctx, ...args, fulfill)
    12. })
    13. }
    14. }

    参考:https://github.com/octet-stream/promisify/blob/master/promisify.js