美文网首页
Promise then方法的参数变成可选参数

Promise then方法的参数变成可选参数

作者: 湘兰沅芷 | 来源:发表于2021-12-19 21:36 被阅读0次
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) {
    successCallback = successCallback ? successCallback : value => value 
    failCallback = failCallback ? failCallback : reason => {throw reason}
    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) => {
  resolve('hello')
  reject('失败')
})
pro.then().then().then(value => console.log(value), reason => console.log(reason))

相关文章

  • Promise then方法的参数变成可选参数

  • Flutter-选填参数

    可选命名参数用 {}表示可选命名的参数必须要写参数名,可以跳过一些参数 调用方法: 可选位置参数用[]表示可选位置...

  • 03. typescript函数定义

    函数定义 2.定义方法传参 方法可选参数 (可选参数必须配置在参数最后面) 默认参数 剩余类型 函数重载 同样的方...

  • 二.Dart方法、异常与类

    方法 一等方法对象 方法可以有两种类型的参数:必需的和可选的。 必需的参数需要在参数列表前面, 后面再定义可选参数...

  • Swif代理

    创建代理的方法为可选(没有带参数) 带参数的代理方法

  • element参数管理

    1.参数管理 A.展示动态参数可选项 动态参数可选项展示及操作在获取动态参数的方法中进行处理。 B.添加/删除可选...

  • 前端学习笔记三十三-电商项目实战(五)

    1.参数管理 A.展示动态参数可选项 动态参数可选项展示及操作在获取动态参数的方法中进行处理。 B.添加/删除可选...

  • OC调用Swift便利构造方法

    问题: OC调用Swift构造方法,自定义参数,我想让day变成可选参数,所以加了问号?,导致objc无法识别,报...

  • Dart基础语法<五> 参数

    本节主要记录Dart方法参数中的 可选位置参数 默认参数 可选命名参数 在java中经常会出现各种重载函数 但一旦...

  • 磨刀- Dart 函数

    ✨✨✨✨✨ 魏什么_多喝水 Flutter 之路 声明 参数 可选参数 可选命名参数: 可选位置参数

网友评论

      本文标题:Promise then方法的参数变成可选参数

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