关于 promisify 函数的那些事儿

797 阅读2分钟

我正在参与掘金会员专属活动-源码共读第一期,点击参与

前言

不知道各位对 promisify 有没有了解。这时候可能有的人会说,我对 promise 都没完全了解,怎么又来个 promisify?确实,我自己对 promise 的掌握程度也就七八分,但是这并不影响我了 promisify,今天大家就跟着我一起来学习一下 promisify 函数。

promisify

什么是 promisify 呢?这个函数的作用就是可以把回调函数转成 promise 形式的函数。回调函数是 Javascript 中最原始的异步处理方案,但是回调函数的缺点也很明显,容易形成回调地狱,以及捕获异常错误不是很方便等等。这时候就出来了 promise 函数来解决这些缺点。不过由于回调函数在之前被广泛使用,所以还是有很多项目中使用了它,因此可以将 promisify 的出现理解为是为了转换 callback 形式为 promise 形式的。

回归正题,跟着川哥的指引,我们在这段代码中发现了 promisify 的踪迹。

const execFile = promisify(childProcess.execFile);

接下来,我们就来简单实现一下 promisify

实现 promisify

function promisify(fn) {
    return function (...args) {
        return new Promise(function (resolve, reject) {
            args.push(function (err, ...arg) {
                if (err) {
                    reject(err);
                    return;
                }
                resolve(...arg);
            });
            fn.apply(null, args);
        });
    }
}

这就是一个封装好的 promisify。在这个 promisify 里,它返回了一个 function,在这个 function 里,又返回了 promise 方法。后续接着判断是否有 error,如果没有错误就将参数 resolve 出来。

promisify 使用

既然已经封装好了一个 promisify,接下来我们来使用一下它吧。

image.png

示例代码如下:

let add = (a, b, callback) => {
  let num = a + b;
  if (typeof num === "number") {
    callback(null, num);
  }
};

const addpromisify = promisify(add);
addpromisify(2, 4).then((res) => {
  console.log(res, "/////");
});

定义一个简单的相加函数 add,然后将相加函数 add 放入 promisify 里进行转换,我们来看一下最后的打印结果。

image.png

从结果中可以推演出 promisify 的内部逻辑 —— 最终结果通过 promise 对象返回。

总结

今天简单实现了一个 promisify,并写了个小例子来使用了它,方便更好地理解我们今天写的这个 promisify 函数。整体而言并不难,哪怕你对 promise 掌握地不够好,也没关系,通过 promisify 也能学到一些关于 promise 的知识。