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

手写 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);
  }
);

相关文章:

  • Redis7系列:设置开机自启
  • 贪心算法三
  • 3月09日奇怪的Incorrect datetime value
  • git worktree的使用
  • c语言笔记 内存管理之栈内存
  • npm终端执行时报错
  • XGBoost介绍
  • 【Academy】OAuth 2.0 身份验证漏洞 ------ OAuth 2.0 authentication vulnerabilities
  • 【Java代码审计 | 第十一篇】SSRF漏洞成因及防范
  • git子仓库管理的两种方式
  • 【Python】整数除法不正确,少1的问题,以及有关浮点数转换的精度问题
  • 二:RV1126的VDEC视频解码模块的工作流程
  • AI革命编程学习:Python语法速通与高阶突破全实战(第二部分:AI辅助调试与高阶编程)
  • Flink-DataStreamAPI-生成水印
  • C++使用BFS求解最短路径
  • NS3学习——运行自定义拥塞控制算法步骤
  • 动态规划中固定倒数第二个数与倒数第一个数的区别与应用场景分析 —— 从最长等差数列问题到统计等差数列个数的填表策略对比
  • 关于前后端整合和打包成exe文件的个人的总结和思考
  • 数据集构建与训练前准备
  • VIC模型有哪些优势?适用哪些范围?基于QGIS的VIC模型建模;未来气候变化模型预测;基于R语言VIC参数率定和优化
  • 北京人艺新戏《一日顶流》将出现人工智能角色
  • 新质观察|低空货运是城市发展低空经济的第一引擎
  • 韦尔股份拟更名豪威集团:更全面体现公司产业布局,准确反映未来战略发展方向
  • 今晚油价下调,加满一箱油将省9元
  • 墨西哥海军帆船纽约撞桥事故已致2人死亡19人受伤
  • 61岁云浮市律师协会副会长谭炳光因突发疾病逝世