手写Promise(二)

35 阅读1分钟

创建then函数

// 记录Promise的三种状态
const PENDING = "pending"
const FULFILLED = "fulfilled"
const REJECTED = "rejected"/*************新增代码***************** */
/**
 * 运行微任务
 * 把传递的回调函数放入微任务队列
 * @param {Function} callback   微任务回调
 */
function runMicroTask(callback) {
  // 判断当前环境是否支持微任务
  // node环境支持
  if (process && process.nextTick) {
    process.nextTick(callback)
  } else if (MutationObserver) {
    const p = document.createElement("p")
    const observer = new MutationObserver(callback)
    observer.observe(p, { childList: true })
    p.innerHTML = "x"
  } else {
    setTimeout(callback, 0)
  }
}
​
/********************************* */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 {Function} onFulfilled  成功回调
   * @param {Function} onRejected   失败回调
   */
  then(onFulfilled, onRejected) {
    return new MyPromise((resolve, reject) => {})
  }
  /*********************************** */
​
  /**
   * @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)
  }
}
​