学习 promise 源码有助于我们更深刻的理解异步。

Promise 源码获取


路径地址
C:\Program Files\nodejs\node_modules\npm\node_modules\es6-promise\lib\es6-promise\promise.js

源码存放在 node.js 根目录下,如果不知道自己的 node.js 安装目录在哪里,可以在环境变量 path 中查看。

当前学习的promise 版本为 4.2.8。
image.png

Promise API 分析


在源码中 promise 的每一个 api 都是写成单独的一个模块,最后在进行组合到 Promise 的静态成员和原型上。接下来我们主要分析一下 promise 都有哪些 api 都有哪些作用。

模块 描述
Promise 构造函数 promise 是由 class 进行定义的。主要用来创建一个 promise 实例,构造函数内部将会通过一个变量进行标记当前 promise 状态。
实例成员 then 调用 then 成功回调函数,并返回一个新的 promise。
实例成员 catch 调用 catch 失败回调函数,并返回一个新的 promise。
实例成员 finally 无论当前状态是成功还是失败,都会调用 finally 回调函数,并返回一个新的 promise。
静态成员 all Promise.all 实际上是一个函数,它接收一个 promises 数组并返回一个 Promise。当所有的 promises 都完成时会得到 resolve 或者当其中一个被拒绝时会得到 rejected。
静态成员 race Promise.race 实际上是一个函数,它接收一个 promises 数组并返回一个 Promise。与 Promise.all 不同的是,当有任意一个 promise 状态发生变化时,则返回的 promise 状态也随之变化。
静态成员 resolve 直接返回一个成功状态的 promise。
静态成员 reject 直接返回一个失败状态的 promise。

主要难点其实在 promise 的链式调用。