手写Promise(一)

39 阅读1分钟

实现状态的改变

// 记录Promise的三种状态
const PENDING = "pending"
const FULFILLED = "fulfilled"
const REJECTED = "rejected"
class MyPromise {
  /**
   * @param {Function} executor   执行器, 立即执行
   */
  constructor(executor) {
    this._state = PENDING // 状态
    this._value = undefined // 数据
    try {
      executor(this._resolve.bind(this), this._reject.bind(this))
    } catch (error) {
      this._reject(error)
    }
  }
  /**
   * @param {String} newState  新状态
   * @param {any} value  新数据
   * 修改状态和数据
   */
  _changeState(newState, value) {
    // 状态只能改变一次
    if (this._state !== PENDING) return
    this._state = newState
    this._value = value
  }
​
  /**
   * 标记当前任务完成
   * @param {any} data  任务返回的数据
   *
   */
  _resolve(data) {
    // 改变状态和数据
    this._changeState(FULFILLED, data)
  }
​
  /**
   * 标记当前任务失败
   * @param {any} reason  失败原因
   */
  _reject(reason) {
    // 改变状态和数据
    this._changeState(REJECTED, reason)
  }
}
​