一步步实现 Promises/A+ 规范 -- 系列三
文章目录
一步步实现 Promises/A+ 规范 – 系列
catch 实现
上一篇文章实现了 Promises/A+ 规范中对 then
方法的要求,实现了 then
链的调用逻辑。本篇文章将实现 catch
方法、all
方法、resolve
方法、reject
方法
then 链的缺失参数调用
首先验证如下代码
|
|
由此看出不传参数不影响后续调用,且把之前的结果传递给后续方法。修改 then 方法如下
|
|
catch 实现原理
catch
的实现其实就是 then
方法没有传第一个参数,只传了第二个参数,这也就是为什么需要先实现上边的逻辑。具体实现:
|
|
Promise.all() 实现
Promise.all
接收一个promise
对象的数组作为参数- 当这个数组里的所有
promise
对象全部变为resolve
,则执行then
中的onFulfilled
- onFulfilled 方法接收一个数组作为参数,这个数组即
promise
对象数组的所有结果,顺序保持一致
- onFulfilled 方法接收一个数组作为参数,这个数组即
有一个变为
reject
,则执行then
中的onRejected
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
// 验证代码一 const promise1 = new Promise((resolve, reject) => { setTimeout(() => { resolve(100); }, 1000) }) const promise2 = new Promise((resolve, reject) => { setTimeout(() => { resolve(200); }, 500) }) Promise.all([promise1, promise2]).then( res => console.log(res) ) // 输出 [ 100, 200 ] 顺序与传入相同 // ----------------- // 验证代码二 const promise1 = new Promise((resolve, reject) => { setTimeout(() => { resolve(100); }, 1000) }) const promise2 = new Promise((resolve, reject) => { setTimeout(() => { reject(200); }, 500) }) Promise.all([promise1, promise2]).then( res => console.log(res), err => console.log(err) ) // 输出 200
返回一个 promise
all
方法需要和 then
方法一样返回一个 promise
,但 all
方法属于类中的静态方法,其调用方式是直接通过类来调用:Promise.all()
,代码实现
|
|
返回一个 prmise
后,该方法就可以链式调用
监控所有 promise 执行状态
每一个 promise 实例的状态可以通过添加 then 方法进行判断,实现如下
|
|
Promise.resolve() 实现
|
|
Promise.reject() 实现
|
|
到此,就实现了 Promise/A+ 规范,可查看源码
文章作者 Ryan
上次更新 2019-06-05