基础-promise的实现过程(2)

66 阅读1分钟

前面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);
    }
  }