美文网首页让前端飞
promise原理(一)

promise原理(一)

作者: Mr无愧于心 | 来源:发表于2018-07-23 15:55 被阅读2次

简易版

  • 实现了promise的状态管理(padding->resolved)(padding->rejected)
  • 实现了promise的then函数(公有属性)
  • 实现了promise中对异步函数的处理(发布订阅)
  • 实现了promise的参数传递(利用挂载到promise对象上实现value,reason共享)
  • 实现了promise的异常捕捉(try--catch--reject)

  • 没有实现链式调用(情况较多,难度系数较高)
  • 没有实现catch错误处理
  • 没有实现all,race,reject ,resolve等方法

//ES6定义promise构造函数
class Promise {
  constructor(executor) {//私有属性
    // 默认状态是等待态
    this.status = 'pending';//初始状态padding
    this.value = undefined;//
    this.reason = undefined;//
    // 存放成功的回调(订阅发布中的事件池,当promise中是异步的情况下,不能立即执行)
    this.onResolvedCallbacks = [];
    // 存放失败的回调(订阅发布中的事件池,当promise中是异步的情况下,不能立即执行)
    this.onRejectedCallbacks = [];
    let resolve = (data) => {
      if (this.status === 'pending') {//只有等待状态才可以转化成成功状态
        this.value = data;//把当前的值传递给promsie对象,,已便then函数中onFulFilled回调使用
        this.status = 'resolved';//改变当前状态为resolved,且不能再次改变
        this.onResolvedCallbacks.forEach(fn => fn());//当resolve函数执行时,执行成功事件池中的所有回调(订阅)
      }
    }
    let reject = (reason) => {
      if (this.status === 'pending') {//只有等待状态才可以转化成失败状态
        this.reason = reason;//把失败的原因传递给promise对象,已便then函数中onRejected回调使用
        this.status = 'rejected';//改变当前状态为rejected,且不能再次改变
        this.onRejectedCallbacks.forEach(fn => fn());//当reject函数执行时,执行失败事件池中的所有回调(订阅)
      }
    }
    try { // 执行时可能会发生异常
      executor(resolve, reject);
    } catch (e) {
      reject(e); // promise失败了,直接调用reject函数,捕捉错误
    }
  }
  then(onFulFilled, onRejected) {  //公有属性 then 方法
  //判断状态调用不同的处理函数
    if (this.status === 'resolved') {//如果当前状态改变为resolved,那么就执行then的第一个回调,并传入this.value值
      onFulFilled(this.value);
    }
    if (this.status === 'rejected') {//如果当前状态改变为rejected,那么就执行then的第二个回调,并传入失败原因this.reason
      onRejected(this.reason);
    }
    // 当前既没有完成 也没有失败(说明resolve和reject都没有执行,在异步函数中)
    if (this.status === 'pending') {
      // 存放成功的回调(发布订阅中的订阅,当resolve执行时发布,执行所有的then中的onFulFilled)
      this.onResolvedCallbacks.push(() => {
        onFulFilled(this.value);
      });
      // 存放失败的回调(发布订阅中的订阅,当reject执行时发布,执行所有的then中的onRejected)
      this.onRejectedCallbacks.push(() => {
        onRejected(this.reason);
      });
    }
  }
}
module.exports = Promise;

相关文章

网友评论

    本文标题:promise原理(一)

    本文链接:https://www.haomeiwen.com/subject/aupdmftx.html