手写Promise
参考资料:掘金,手写Promise
1.先看个Promise例子
1 | new Promise(function (resolve, reject) { |
1) 看到Promise接收一个参数,并且有三种状态 pending,fulfilled,rejected
调用resolve 状态从pending => fulfilled
调用reject 状态从pending => rejected
并且不可逆转
2)先声明个promise函数,接受个一个函数,有个状态pending
,resolve和reject方法都接受一个参数,并且要保存这个参数。并且有pending
的状态改变
1 | function MyPromise(exector) { |
2.实现Promise.prototype.then
1)先看then方法
1 | new Promise(function (resolve, reject) { |
2)then方法实现:它接受两个参数,onFulfilled和onRejected,两个方法都有接收参数
1 | MyPromise.prototype.then = function(onFulfilled,onRejected){ |
这里调用的then方法相当于 Promise.then()的调用
1 | MyPromise = { |
所以this指向Promise
3.实现异步处理
1)promise经常用来处理异步操作。
添加两个数组,用来存放成功与失败的回调函数。
1 | function MyPromise(exector) { |
4.实现多个then的链式调用方法
1)
Promise
对象的 then
方法接受两个参数:
1 | promise.then(onFulfilled, onRejected) |
onFulfilled
和 onRejected
都是可选参数。
- 如果
onFulfilled
或onRejected
不是函数,其必须被忽略
onFulfilled 特性
如果 onFulfilled
是函数:
- 当
promise
状态变为成功时必须被调用,其第一个参数为promise
成功状态传入的值(resolve
执行时传入的值) - 在
promise
状态改变前其不可被调用 - 其调用次数不可超过一次
onRejected 特性
如果 onRejected
是函数:
- 当
promise
状态变为失败时必须被调用,其第一个参数为promise
失败状态传入的值(reject
执行时传入的值) - 在
promise
状态改变前其不可被调用 - 其调用次数不可超过一次
多次调用
then
方法可以被同一个 promise
对象调用多次
- 当
promise
成功状态时,所有onFulfilled
需按照其注册顺序依次回调 - 当
promise
失败状态时,所有onRejected
需按照其注册顺序依次回调
返回
then
方法必须返回一个新的 promise
对象
2)
如果 onFulfilled
或者 onRejected
返回一个值 x
,则运行下面的 Promise
解决过程:[[Resolve]](promise2, x)
- 若
x
不为Promise
,则使x
直接作为新返回的Promise
对象的值, 即新的onFulfilled
或者onRejected
函数的参数. - 若
x
为Promise
,这时后一个回调函数,就会等待该Promise
对象(即x
)的状态发生变化,才会被调用,并且新的Promise
状态和x
的状态相同。
1 | MyPromise.prototype.then = function (onFulfilled, onRejected) { |
抽出一下重复部分,修改了部分,增加了catch方法
1 |
|