Promises/A+ 规范可在这里查看
promise 有 3 个状态,分别为 pending, fulfilled 和 rejected
- promise 在
pending状态- 可以切换到
fulfilled或rejected状态
- 可以切换到
- promise 在
fulfilled状态- 不可以切换到其它状态
- 必须有个不可以更改的 value 值
- promise 在
rejected状态- 不可以切换到其它状态
- 必须有个不可以更改的 reason 值
1 | // promise 三种状态 |
状态迁移方法,即调用了 fn(resolve, reject) 中的 resolve, reject 方法后,需要改变 promise 状态:
pending --> fulfilled
pending --> rejected
1 | function transitionState (promise, state, result) { |
then 方法返回的是一个新的 Promise 实例(注意:不是原来那个 Promise 实例),只有这样才能不断的链式调用,依次改变状态
1 | MyPromise.prototype.then = function (onFulfilled, onRejected) { |
1 | const isFunction = arg => typeof arg === 'function' |
以上代码,只支持 Promise 回调函数参数 resolve 和 reject 同步调用的情况,如下示例代码:
1 | // 支持 |
但是,使用异步调用不支持,如下示例代码:
1 | // 暂不支持 |
之所以不支持异步调用 resolve 或 reject,是因为 then 方法中如下代码片段:
1 | // 当 resolve 为异步调用,then 方法执行时,promise 状态为 pending。 |
为支持 resolve、reject 异步调用,状态迁移方法 transitionState,做如下修改:
1 | function transitionState (promise, state, result) { |
因为 catch 方法是 .then(null, onRejected) 的别名,所以实现 catch 代码如下:
1 | MyPromise.prototype.catch = function (onRejected) { |
如上,简单实现了 promise,支持链式调用 then 和 catch
欢迎关注无广告文章公众号:学前端

