前端日记
今天是前端日记的第六天,现在实现下promise的then,然后与大家一起分享。一个前端小白的学习之路。
promise.then分析
用通俗的话来说:
- then方法提供一个供自定义的回调函数,若传入非函数,则会忽略当前then方法。
- 回调函数中会把上一个then中返回的值当做参数值供当前then方法调用。
- then方法执行完毕后需要返回一个新的值给下一个then调用(没有返回值默认使用undefined)。
- 每个then只可能使用前一个then的返回值。
从上一篇文章可以看到,我们已经实现了简单的promise类,现在 我们一步步实现then方法,首先then想要链式调用,一定要返回一个promise的对象,如此可以写
then(onFulfilled, onRejected) {
let self = this; //这个是当前promise
return new Mpromise((resolve, reject) => {
//这个是下一个promise
//里面的内容会立即执行....
});
}
由于new Mpromise后会立即执行里面的内容,如果当前promise的状态是resolve,首先执行当前promise中then的resolve函数。
1、如果当前promise中then的resolve函数返回值一个值,直接把它传给下一个promise,通过resolve(result)把下一个promise的状态改变为成功,因为下一个promise的状态默认是成功的。
2、如果当前promise中then的resolve函数返回值一个promise对象称为p2,则执行p2的then,把下一个promise的状态与p2的状态相互绑定。
3、如果当过程中任意一步出错,则导致下一个promise的状态改变为失败
//成功状态
if (this.status === Mpromise.FULFILLED) {
setTimeout(() => {
try {
let result = onFulfilled(this.value); //执行onFulfilled函数
if (result instanceof Mpromise) {
//判断返回值是否是一个promise对象
// p2的then可以获取 p2的状态 然后改变第二个then的状态
result.then(
(value) => {
resolve(value); //如果p2是成功 第二个then也成功
},
(reason) => {
reject(reason); //如果p2失败 第二个then也失败
}
);
} else {
resolve(result); //如果是返回值,直接调用一下个promise的resovle
}
} catch (error) {
reject(error);
}
}<