17.自定义封装-resolve 和 reject 代码实现

本文详细介绍了JavaScriptPromise的构造过程,包括如何使用resolve和reject函数改变对象状态,以及如何处理try...catch中的异常,确保Promise状态只修改一次。
摘要由CSDN通过智能技术生成

1.resolve 函数会修改对象的状态和设置对象结果值,所以首先先去添加对象状态属性和对象结果属性

  function Promise(executor) {
    this.PromiseState = "pending";
    this.PromiseResult = null;
    function resolve(data) {}
    function reject(data) {}
    executor(resolve, reject);
  }

2.在定义的 resolve 中进行功能实现, 此时不能直接 this.PromiseState = 'resolved',因为这个 resolve 在调用的时候是直接调用的,this 指向 window,所以我们需要保存实例 this

  function Promise(executor) {
    const self = this;
    this.PromiseState = "pending";
    this.PromiseResult = null;
    function resolve(data) {}
    function reject(data) {}
    executor(resolve, reject);
  }

3.然后在定义的 resolve 函数里进行功能实现,reject 函数同理

  function Promise(executor) {
    const self = this;
    this.PromiseState = "pending";
    this.PromiseResult = null;
    function resolve(data) {
      self.PromiseState = "resolved";
      self.PromiseResult = data;
    }
    function reject(data) {
      self.PromiseState = "rejected";
      self.PromiseResult = data;
    }
    executor(resolve, reject);
  }

 4.throw 抛出异常改变状态

 要处理 throw 抛出的异常,就需要 try...catch,现在就是考虑加在哪里,throw 是在执行器中执行,所以我们需要把 try 包裹 executor

  function Promise(executor) {
    this.PromiseState = "pending";
    this.PromiseResult = null;
    function resolve(data) {
      self.PromiseState = "resolved";
      self.PromiseResult = data;
    }
    function reject(data) {
      self.PromiseState = "rejected";
      self.PromiseResult = data;
    }
    try {
      executor(resolve, reject);
    } catch (e) {}
  }

然后在 catch 修改 promise 的状态为失败,调用 reject 方法将状态改为失败,抛出的错误会传给 catch(e)的 e,所以我们只需要把 e 传给 reject()就好

  function Promise(executor) {
    this.PromiseState = "pending";
    this.PromiseResult = null;
    function resolve(data) {
      self.PromiseState = "resolved";
      self.PromiseResult = data;
    }
    function reject(data) {
      self.PromiseState = "rejected";
      self.PromiseResult = data;
    }
    try {
      executor(resolve, reject);
    } catch (e) {
      reject(e);
    }
  }

5.promise 对象状态只能修改一次

promise 对象状态只能修改一次,所以我们在修改状态的时候要先看一下这个状态是否已经改变了,在 resolve 和 reject 函数中加个判断,如果状态为 pending 就执行,不是就直接 return

  function Promise(executor) {
    this.PromiseState = "pending";
    this.PromiseResult = null;
    function resolve(data) {
      if (self.PromiseState !== "pending") return;
      self.PromiseState = "resolved";
      self.PromiseResult = data;
    }
    function reject(data) {
      if (self.PromiseState !== "pending") return;
      self.PromiseState = "rejected";
      self.PromiseResult = data;
    }
    try {
      executor(resolve, reject);
    } catch (e) {
      reject(e);
    }
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值