美文网首页
Promise捕获错误

Promise捕获错误

作者: 湘兰沅芷 | 来源:发表于2021-12-18 21:30 被阅读0次

    1.捕获执行器异常

    const MyPromise = require('./myPromise')
    let pro = new MyPromise((resolve, reject) => {
      throw new Error('executor error')
      resolve('hello')
    })
    pro.then(value => {
      console.log(value)
    }, reason => {
      console.log(reason.message)
    })
    
    const PENDING = 'pending' // 等待
    const FULFILLED = 'fulfilled' // 成功
    const REJECTED = 'rejected'// 失败
    class MyPromise {
      constructor(executor) {
        // 捕获执行器错误
        try{
          executor(this.resolve, this.reject)
        } catch (e) {
          this.reject(e)
        }
      }
      status = PENDING
      value = undefined
      reason = undefined
      successCallback = []
      failCallback = []
      resolve = value => {
        if (this.status !== PENDING) return
        // 将状态修改为成功
        this.status = FULFILLED
        // 保存成功之后的值
        this.value = value
        // this.successCallback && this.successCallback(this.value)
        while(this.successCallback.length) {
          this.successCallback.shift()(this.value)
        }
      }
      reject = reason => {
        if (this.status !== PENDING) return
        this.status = REJECTED
        this.reason = reason
        // this.failCallback && this.failCallback(this.reason)
        while(this.failCallback.length) {
          this.failCallback.shift()(this.reason)
        }
      }
      then(successCallback, failCallback) {
        let promise2 = new MyPromise((resolve, reject) => {
          if (this.status === FULFILLED) {
            setTimeout(() => {
              let x = successCallback(this.value)
              // resolve(x)
              resolvePromise(promise2, x, resolve, reject)
            }, 0)
          } else if (this.status === REJECTED) {
            failCallback(this.reason)
          } else {
            // 等待
            // 讲成功回调和失败回调进行存储
            this.successCallback.push(successCallback)
            this.failCallback.push(failCallback)
          }
        })
        return promise2
      }
    }
    
    function resolvePromise(promise2, x, resolve, reject) {
      if (promise2 === x) {
       return reject(new TypeError('Chaining cycle detected for promise #<Promise>'))
      }
      if (x instanceof MyPromise) {
        // x.then(value => resolve(value), reason => reject(reason))
        x.then(resolve, reject)
      } else {
        resolve(x)
      }
    }
    
    module.exports = MyPromise
    

    2.then函数抛出异常

    let pro = new MyPromise((resolve, reject) => {
      // throw new Error('executor error')
      resolve('hello')
    })
    pro.then(value => {
      console.log(value)
      throw new Error('then error')
    }, reason => {
      console.log(reason.message)
    }).then(value => {
      console.log(value)
    }, reason => {
      console.log(reason.message)
    })
    
    const PENDING = 'pending' // 等待
    const FULFILLED = 'fulfilled' // 成功
    const REJECTED = 'rejected'// 失败
    class MyPromise {
      constructor(executor) {
        // 捕获执行器错误
        try{
          executor(this.resolve, this.reject)
        } catch (e) {
          this.reject(e)
        }
      }
      status = PENDING
      value = undefined
      reason = undefined
      successCallback = []
      failCallback = []
      resolve = value => {
        if (this.status !== PENDING) return
        // 将状态修改为成功
        this.status = FULFILLED
        // 保存成功之后的值
        this.value = value
        // this.successCallback && this.successCallback(this.value)
        while(this.successCallback.length) {
          this.successCallback.shift()(this.value)
        }
      }
      reject = reason => {
        if (this.status !== PENDING) return
        this.status = REJECTED
        this.reason = reason
        // this.failCallback && this.failCallback(this.reason)
        while(this.failCallback.length) {
          this.failCallback.shift()(this.reason)
        }
      }
      then(successCallback, failCallback) {
        let promise2 = new MyPromise((resolve, reject) => {
          if (this.status === FULFILLED) {
            setTimeout(() => {
              try {
                let x = successCallback(this.value)
                // 判断x的值是普通值还是promise对象
                // 如果是普通值,直接调用resolve
                // 如果是promise对象,查看promise对象返回的结果
                // 再根据promise对象返回的结果,决定调用resolve还是reject
                resolvePromise(promise2, x, resolve, reject)
              } catch(e) {
                reject(e)
              }
            }, 0)
          } else if (this.status === REJECTED) {
            failCallback(this.reason)
          } else {
            // 等待
            // 讲成功回调和失败回调进行存储
            this.successCallback.push(successCallback)
            this.failCallback.push(failCallback)
          }
        })
        return promise2
      }
    }
    
    function resolvePromise(promise2, x, resolve, reject) {
      if (promise2 === x) {
       return reject(new TypeError('Chaining cycle detected for promise #<Promise>'))
      }
      if (x instanceof MyPromise) {
        // x.then(value => resolve(value), reason => reject(reason))
        x.then(resolve, reject)
      } else {
        resolve(x)
      }
    }
    
    module.exports = MyPromise
    

    3.异步情况的处理

    const PENDING = 'pending' // 等待
    const FULFILLED = 'fulfilled' // 成功
    const REJECTED = 'rejected'// 失败
    class MyPromise {
      constructor(executor) {
        // 捕获执行器错误
        try{
          executor(this.resolve, this.reject)
        } catch (e) {
          this.reject(e)
        }
      }
      status = PENDING
      value = undefined
      reason = undefined
      successCallback = []
      failCallback = []
      resolve = value => {
        if (this.status !== PENDING) return
        // 将状态修改为成功
        this.status = FULFILLED
        // 保存成功之后的值
        this.value = value
        // this.successCallback && this.successCallback(this.value)
        while(this.successCallback.length) {
          this.successCallback.shift()()
        }
      }
      reject = reason => {
        if (this.status !== PENDING) return
        this.status = REJECTED
        this.reason = reason
        // this.failCallback && this.failCallback(this.reason)
        while(this.failCallback.length) {
          this.failCallback.shift()()
        }
      }
      then(successCallback, failCallback) {
        let promise2 = new MyPromise((resolve, reject) => {
          if (this.status === FULFILLED) {
            setTimeout(() => {
              try {
                let x = successCallback(this.value)
                // 判断x的值是普通值还是promise对象
                // 如果是普通值,直接调用resolve
                // 如果是promise对象,查看promise对象返回的结果
                // 再根据promise对象返回的结果,决定调用resolve还是reject
                resolvePromise(promise2, x, resolve, reject)
              } catch(e) {
                reject(e)
              }
            }, 0)
          } else if (this.status === REJECTED) {
            setTimeout(() => {
              try {
                let x = failCallback(this.reason)
                // 判断x的值是普通值还是promise对象
                // 如果是普通值,直接调用resolve
                // 如果是promise对象,查看promise对象返回的结果
                // 再根据promise对象返回的结果,决定调用resolve还是reject
                resolvePromise(promise2, x, resolve, reject)
              } catch(e) {
                reject(e)
              }
            }, 0)
          } else {
            // 等待
            // 讲成功回调和失败回调进行存储
            this.successCallback.push(() => {
              setTimeout(() => {
                try {
                  let x = successCallback(this.value)
                  // 判断x的值是普通值还是promise对象
                  // 如果是普通值,直接调用resolve
                  // 如果是promise对象,查看promise对象返回的结果
                  // 再根据promise对象返回的结果,决定调用resolve还是reject
                  resolvePromise(promise2, x, resolve, reject)
                } catch(e) {
                  reject(e)
                }
              }, 0)
            })
            this.failCallback.push(() => {
              setTimeout(() => {
                try {
                  let x = failCallback(this.reason)
                  // 判断x的值是普通值还是promise对象
                  // 如果是普通值,直接调用resolve
                  // 如果是promise对象,查看promise对象返回的结果
                  // 再根据promise对象返回的结果,决定调用resolve还是reject
                  resolvePromise(promise2, x, resolve, reject)
                } catch(e) {
                  reject(e)
                }
              }, 0)
            })
          }
        })
        return promise2
      }
    }
    
    function resolvePromise(promise2, x, resolve, reject) {
      if (promise2 === x) {
       return reject(new TypeError('Chaining cycle detected for promise #<Promise>'))
      }
      if (x instanceof MyPromise) {
        // x.then(value => resolve(value), reason => reject(reason))
        x.then(resolve, reject)
      } else {
        resolve(x)
      }
    }
    
    module.exports = MyPromise
    
    let pro = new MyPromise((resolve, reject) => {
      // throw new Error('executor error')
      // resolve('hello')
      // reject('失败')
      setTimeout(() => {
        resolve('成功。。。')
      }, 2000)
    })
    pro.then(value => {
      console.log(value + '1')
      // throw new Error('then error')
      return 'aaa'
    }, reason => {
      console.log(reason + '2')
      return 10000
    }).then(value => {
      console.log(value + '3')
    })
    

    相关文章

      网友评论

          本文标题:Promise捕获错误

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