当前位置: 首页 > article >正文

手写 Promise 的实现

什么是 Promise

Promise 是一个类。

当通过new Promise创建一个实例时,需要传入一个回调函数,我们称之为 executor

  • 这个回调函数会被立即执行,并传入两个回调函数的参数 (resolve, reject)
  • 当调用 resolve 回调函数时,会执行 Promise 对象的 then 方法传入的回调。
  • 当调用 reject 回调函数时,会执行 Promise 对象的 catch 方法传入的回调。

Promise 是一个状态机制,它有3种状态:

  • pending:待定状态,执行 executor 后,处于这个状态。
  • fulfilled:兑现状态,调用 resolve() 后,Promise 的状态更改为 fulfilled,并且无法再次更改。
  • rejected:拒绝状态,调用 reject() 后,Promise 的状态更改为 rejected,并且无法再次更改。

手写一个 Promise 编程

// 定义一个Promise的类
class newPromise {
  constructor(executor = () => { }) {
    // 执行构造函数,并把状态值设置为pending
    this.state = STATUS_PENGINDING; // 初始状态
    this.value = null;  // 成功的返回值
    this.reason = null; // 失败的返回值

    // resolve 需要接收一个参数
    const resolve = (value) => {
      // 防止重复执行,表示状态不可逆
      // 只有状态是 pending 时,才会改变执行改变状态
      // 执行 resolve 后,状态值变成 fulfilled
      if (this.state === STATUS_PENGINDING) {
        this.state = STATUS_FULFILLED;
        this.value = value;
      }
    }

    // reject 需要接收一个参数
    const reject = (reason) => {
      // 防止重复执行,表示状态不可逆
      // 只有状态是 pending 时,才会改变执行改变状态
      // 执行 reject 后,状态值变成 rejected
      if (this.state === STATUS_PENGINDING) {
        this.state = STATUS_REJECTED;
        this.reason = reason;
      }
    }

    // 传入的回调会返回两个参数 resolve 和 reject
    executor(resolve, reject);
  }

  // then接收两个回调,分别用于处理成功和失败
  then(onFulfilled, onRejected) {
    // 穿透就是没有方法,则给一个默认的方法,将值传下去
    if (onFulfilled && typeof onFulfilled === 'function') {
      onFulfilled(this.value);
    }
    if (onRejected && typeof onRejected === 'function') {
      onRejected(this.reason);
    }
  }
}
// 执行上面定义的方法
new newPromise((resolve, reject) => {
  // 这两个状态只能二选一
  // resolve('成功返回值');
  reject('失败返回值');
}).then(
  res => {
    console.log('成功的', res);
  },
  err => {
    console.log('失败的', err);
  }
);

http://www.kler.cn/a/579701.html

相关文章:

  • 【YOLOv12改进trick】医学图像分割网络CMUNeXt引入YOLOv12中,增强全局上下文信息实现涨点,含创新点Python代码,方便发论文
  • Liunx系统 : 进程间通信【IPC-Shm共享内存】
  • AutoDL平台租借GPU,创建transformers环境,使用VSCode SSH登录
  • C#实现高性能异步文件下载器(支持进度显示/断点续传)
  • Python 入门教程(2)搭建环境 2.4、VSCode配置Node.js运行环境
  • 搜广推校招面经四十一
  • 【C】链式二叉树算法题2
  • P2P中NAT穿越方案(UDP/TCP)(转)
  • SQLite与Room持久化
  • 架构思维:高性能架构_01基础概念
  • Github Copilot:企业管理员获取度量数据metrics
  • 深入解析Java包装类型:从基础到高级应用
  • 【Linux docker】关于docker启动出错的解决方法。
  • Mac清理磁盘空间,不删文件也能磁盘瘦身
  • 文件和异常
  • WPF从初学者到专家:实战项目经验分享与总结
  • 前端网络安全面试题及答案
  • JSON、GET 查询参数(URL 参数)和 POST 表单数据(x-www-form-urlencoded 或 form-data)三种方式的对比分析
  • 数据分析师的Python入门(8)——真实业务场景实战
  • STM32F103C8T6 CAN收发