探索 Promisfy 原理

在 Node.js 中,不少异步函数只支持回调函数形式的用法,比如 readFile。采

用回调函数会导致函数不断嵌套,降低了代码的可读性。目前处理异步的方式

一般是采用 Promise,它可以很好地解决这个问题。

将回调函数 Promisfy

把仅支持回调函数的函数变成 Promise 的形式,也成为 Promisfy。在说明如

何构造它之前,我们先来看看 Promisfy 的用法。

可以看到,利用 Promisfy 装饰某个异步函数之后,就可以像使用 Promise 一

样对异步函数的回调进行接管。

Promisfy 原理

Promisfy 的原理可以简单概括为:

首先构造一个函数。此函数传入一个支持回调函数的异步函数,并返回一个函

数。该函数代替原来的函数接收参数,并返回一个 Promise 的对象。在这个

Promise 对象中,我们利用 resolve 与 reject 构造一个回调函数并压入原异步

函数堆栈。这样我们在调用 then 方法的时候就能执行改造过的函数。



分解动作

下面一步一步来分解 Promisfy 的代码。首先我们必须构造一个能够返回函数

的函数,这样才能确保函数 promsify 后仍然是一个函数。

对应的实现代码也非常简单。这里首先会对传入的函数进行类似装饰的操作,

返回一个新的函数,记做 F。F 会将传入的参数全部计入 args 数组。在我们的

例子中, args 就会赋值为 [‘package.json’ , ‘utf8’] 。当 F 被调用后,会返回一

个 Promise 对象。

Promise 内部细节

一个 Promise 对象在 then 方法执行后才会执行。我们在其内部对原异步函数

进行改造,构造一个回调函数,当异步函数执行成功的时调用 resolve,执行失

败时调用 reject。

执行函数

最后,利用 fn.apply 方法执行改造过的异步函数。由于我们对 args 数组做了

修改,在最后压入了自定义的回调函数。那么在执行时,异步函数就会调用这

个回调函数,而这个回调函数,又会利用 then 中自定义的 resolve 和 reject

方法。从而输出结果。

最后

可以访问这个仓库,调试本文的代码。其中测试部分用到了 Jest

发表评论

电子邮件地址不会被公开。 必填项已用*标注