前面myPromise差不多了,然后现在还进行一下优化。
1.抽离变量
现在我们在好几个地方都用到了状态的,也就是用字符串表示,那多个地方的用到的话,我们可以把它抽出来,用一个变量来表示。
const PENDING = "pending";
const FULFILLED = "fulfilled";
const REJECTED = "rejected";
2.抽离函数
不管是resolve还是reject,都会有一个改变状态和数据的操作,那其实可以把这过程抽离成一个函数。
/**
* @description: 改变状态和数据
* @param {*} state 状态
* @param {*} value 数据
* @return {*}
*/
_changeState(state, value) {
this._state = state;
this._value = value;
}
/**
* @description: 标记当前任务完成
* @param {*} value 任务完成的相关数据
*/
_resolve(value) {
//改变状态和数据
this._changeState(FULFILLED, value);
}
3.固定状态
promise的状态是不能更改的啊,要么成功了,要么失败了。但现在是调用了resolve之后还可以调用reject,所以我们要限制一下。
_changeState(state, value) {
if (this._state !== PENDING) return;
this._state = state;
this._value = value;
}
4.错误处理
当promise在执行期间一旦报错,状态就会自动变为rejected。所以我们来处理一下,如果运行期间出现错误,直接调用_rejected函数。
constructor(excutor) {
this._state = PENDING; //状态
this._value = undefined; //数据
try {
excutor(this._resolve.bind(this), this._reject.bind(this)); //绑定this
} catch (error) {
this._reject(error);
}
}