Promise的实现 then方法的具体实现(二)

目录

Promise的实现 then方法的具体实现(二)

一、封装handle方法用于调用指定的回调函数,根据执行的结果改变return的promise的状态

二、根据当前状态执行不同的操作

三、指定回调函数的默认值(完整的then方法)


Promise的实现 then方法的具体实现(二)

一、封装handle方法用于调用指定的回调函数,根据执行的结果改变return的promise的状态

  1. 如果抛出异常,return的promise就会失败,reason就是error

  2. 如果回调函数返回不是promise,return的promise就会成功,value就是返回的值

  3. 如果回调函数返回的是promise,return的promise结果就是这个promise的结果

  Promise.prototype.then = function (onResolved, onRejected) {
    const self = this
    // 返回一个新的promise对象
    return new Promise((resolve, reject) => {
      //有可能调用onResolved 或者 onRejected
      /*
      调用指定的回调函数处理,根据执行的结果改变return的promise的状态
      */
      function handle(callback) {
        /*
          1.如果抛出异常,return的promise就会失败,reason就是error
          2.如果回调函数返回不是promise,return的promise就会成功,value就是返回的值
          3.如果回调函数返回的是promise,return的promise结果就是这个promise的结果
          */
        try {
          const result = callback(self.data)
          if (result instanceof Promise) {
            //3.如果回调函数返回的是promise,return的promise结果就是这个promise的结果
            // result.then(
            //   (value) => resolve(value),
            //   (reason) => reject(reason)
            // )
            //简单的写法
            result.then(resolve, reject)
          } else {
            //2.如果回调函数返回不是promise,return的promise就会成功,value就是返回的值
            resolve(result)
          }
        } catch (error) {
          //1.如果抛出异常,return的promise就会失败,reason就是error
          reject(error)
        }
      }
    })
  }

二、根据当前状态执行不同的操作

Promise.prototype.then = function (onResolved, onRejected) {
    const self = this
    // 返回一个新的promise对象
    return new Promise((resolve, reject) => {
      //有可能调用onResolved 或者 onRejected
      /*
      调用指定的回调函数处理,根据执行的结果改变return的promise的状态
      */
      function handle(callback) {}//同上
      if (self.status === PENDING) {
        // 当前状态还是pending状态,将回调函数保存起来
        self.callbacks.push({
          onResolved() {
            handle(onResolved)
          },
          onRejected() {
            handle(onRejected)
          },
        })
      } else if (self.status === RESOLVED) {
        //如果当前是resolved状态,异步执行onResolve并改变return的promise的状态
        setTimeout(() => {
          handle(onResolved)
        })
      } else {
        //如果当前是rejected状态,异步执行onRejected并改变return的promise的状态
        setTimeout(() => {
          handle(onRejected)
        })
      }
    })
  }

三、指定回调函数的默认值(完整的then方法)

  Promise.prototype.then = function (onResolved, onRejected) {
    onResolved =
      typeof onResolved === 'function' ? onResolved : (value) => value //向后传递成功的value
    //指定默认的失败的回调(实现错误/异常传透的关键点)
    onRejected =
      typeof onRejected === 'function' ?
      onRejected :
      (reason) => {
        throw reason
      } //向后传递失败的reason
    const self = this
    // 返回一个新的promise对象
    return new Promise((resolve, reject) => {
      //有可能调用onResolved 或者 onRejected
      /*
      调用指定的回调函数处理,根据执行的结果改变return的promise的状态
      */
      function handle(callback) {
        /*
          1.如果抛出异常,return的promise就会失败,reason就是error
          2.如果回调函数返回不是promise,return的promise就会成功,value就是返回的值
          3.如果回调函数返回的是promise,return的promise结果就是这个promise的结果
          */
        try {
          const result = callback(self.data)
          if (result instanceof Promise) {
            //3.如果回调函数返回的是promise,return的promise结果就是这个promise的结果
            // result.then(
            //   (value) => resolve(value),
            //   (reason) => reject(reason)
            // )
            //简单的写法
            result.then(resolve, reject)
          } else {
            //2.如果回调函数返回不是promise,return的promise就会成功,value就是返回的值
            resolve(result)
          }
        } catch (error) {
          //1.如果抛出异常,return的promise就会失败,reason就是error
          reject(error)
        }
      }
      if (self.status === PENDING) {
        // 当前状态还是pending状态,将回调函数保存起来
        self.callbacks.push({
          onResolved() {
            handle(onResolved)
          },
          onRejected() {
            handle(onRejected)
          },
        })
      } else if (self.status === RESOLVED) {
        //如果当前是resolved状态,异步执行onResolve并改变return的promise的状态
        setTimeout(() => {
          handle(onResolved)
        })
      } else {
        //如果当前是rejected状态,异步执行onRejected并改变return的promise的状态
        setTimeout(() => {
          handle(onRejected)
        })
      }
    })
  }

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我了解你的问题。这里我将使用JavaScript语言来实现红绿灯的promise实现。 首先,我们需要定义一个函数来模拟红绿灯的变化过程。这个函数会接受两个参数,一个是颜色,另一个是时间。 ```javascript function changeLight(color, time) { return new Promise(function(resolve, reject) { setTimeout(function() { if (color === 'red') { console.log('红灯亮了'); } else if (color === 'green') { console.log('绿灯亮了'); } else if (color === 'yellow') { console.log('黄灯亮了'); } resolve(); }, time); }); } ``` 接下来,我们可以使用该函数来实现一个红绿灯的交替变化。具体来说,我们可以使用promise的then()方法实现这个交替变化过程。 ```javascript changeLight('red', 3000) .then(function() { return changeLight('green', 2000); }) .then(function() { return changeLight('yellow', 1000); }) .then(function() { return changeLight('red', 3000); }); ``` 在这个例子中,首先我们调用了changeLight()函数,让红灯亮起来。然后我们使用then()方法来等待这个promise完成,并调用changeLight()函数让绿灯亮起来。接着我们再次使用then()方法等待第promise完成,并调用changeLight()函数让黄灯亮起来。最后,我们再次使用then()方法等待第三个promise完成,并调用changeLight()函数让红灯亮起来。这样,就实现了一个简单的红绿灯交替变化的效果。 希望这个例子能够帮助到你,如果你还有其他问题,可以继续问我哦。 ### 回答2: 要实现红绿灯的功能,可以使用Promise来管理灯的状态转换。首先,我们需要定义一个Promise对象,初始状态为绿灯亮。然后,通过setTimeout函数来模拟灯的状态改变。 首先,创建一个Promise对象,将初始状态设置为绿灯亮,并返回Promise实例: ```javascript const trafficLight = new Promise((resolve, reject) => { resolve('绿灯亮'); }); ``` 接下来,可以通过.then方法来监听Promise的状态变化,并根据不同的状态执行相应的操作。在.then方法中,可以使用setTimeout来模拟灯的状态改变,并通过resolve方法来改变Promise的状态: ```javascript trafficLight.then((status) => { console.log(status); // 初始状态为绿灯亮 return new Promise((resolve, reject) => { setTimeout(() => { resolve('黄灯亮'); }, 2000); }); }).then((status) => { console.log(status); // 等待2秒后,黄灯亮 return new Promise((resolve, reject) => { setTimeout(() => { resolve('红灯亮'); }, 1000); }); }).then((status) => { console.log(status); // 等待1秒后,红灯亮 }); ``` 上述代码中,通过链式调用.then方法实现了红绿灯的状态转换。在每个.then方法中,使用setTimeout来模拟状态改变,并通过resolve方法将状态改变传递给Promise对象。这样,我们就可以在每个.then方法中监听到状态的变化并执行相应的操作。 通过上述代码,可以实现红绿灯的状态转换,并在控制台输出每个状态的变化。 ### 回答3: 红绿灯是交通中常见的信号灯,用于指示车辆和行人何时可以通行。为了实现红绿灯的功能,可以使用promise来进行控制。 首先,我们可以创建一个promise对象来表示红绿灯的状态。在promise对象中,我们可以设定两种状态:红灯和绿灯。 当红灯亮时,表示车辆和行人需要停下等待。这时,我们可以返回一个promise对象,并在其中使用setTimeout函数模拟红灯的等待时间。在红灯等待时间结束后,我们可以将promise状态改为resolve,表示红灯变为绿灯。 当绿灯亮时,表示车辆和行人可以通行。为了模拟绿灯的持续时间,我们同样可以返回一个promise对象,并在其中使用setTimeout函数来延迟绿灯的等待时间。在绿灯等待时间结束后,我们同样将promise状态改为resolve,表示绿灯变为红灯。 通过这样的promise设置,我们可以实现红绿灯的循环变换。在每次红灯和绿灯的状态变化时,我们可以对promise进行相应的处理,例如调用.then()方法来执行后续操作。 总结起来,使用promise可以帮助我们实现红绿灯的控制。通过设置promise对象的状态变化,我们可以模拟红灯和绿灯的持续时间,从而实现红绿灯的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值