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

Promise状态和方法都有哪些,以及实现原理

很好 👌 你问的是 Promise 的状态、方法,以及实现原理。我帮你拆成三部分来讲:


一、Promise 的状态

Promise 内部有 三种状态[[PromiseState]]):

  1. pending(进行中):初始状态,既没有被 fulfilled,也没有被 rejected。

  2. fulfilled(已成功):操作成功完成,并返回一个值(用 resolve 触发)。

  3. rejected(已失败):操作失败,并返回失败原因(用 reject 触发)。

⚠️ 特点:

  • 状态 只能从 pending → fulfilledpending → rejected,一旦变化就 不可逆

  • 成功和失败只能发生一次,后续调用 resolve / reject 不会再改变状态。


二、Promise 的方法

1. 实例方法

  • then(onFulfilled, onRejected)

    • 注册成功和失败的回调。

    • 返回一个新的 Promise(可链式调用)。

    • 如果 onFulfilled / onRejected 返回值是 Promise,会进行 状态递归解析

  • catch(onRejected)

    • 相当于 .then(undefined, onRejected)

    • 用于错误捕获。

  • finally(onFinally)

    • 无论成功/失败都会执行。

    • 不会改变链式调用的结果,只做副作用处理。


2. 静态方法

  • Promise.resolve(value)

    • 返回一个 fulfilled 状态的 Promise。

    • 如果参数本身是 Promise,直接返回。

  • Promise.reject(reason)

    • 返回一个 rejected 状态的 Promise。

  • Promise.all(iterable)

    • 并行执行多个 Promise,所有都成功才成功,否则第一个失败就失败。

  • Promise.allSettled(iterable)

    • 等待所有 Promise 执行完,不管成功/失败,返回每个结果的数组。

  • Promise.race(iterable)

    • 谁先有结果(成功或失败)就返回谁的结果。

  • Promise.any(iterable)

    • 只要有一个成功就返回成功,如果全部失败则返回 AggregateError


三、Promise 实现原理

Promise 的核心是 发布-订阅模式 + 状态机 + 事件循环

1. 基础结构

一个 Promise 对象要有:

  • state:存储当前状态(pending / fulfilled / rejected)。

  • value / reason:存储成功的值或失败的原因。

  • handlers:存放 then 注册的回调函数。


2. 构造函数

class MyPromise {constructor(executor) {this.state = 'pending';this.value = undefined;this.reason = undefined;this.onFulfilledCallbacks = [];this.onRejectedCallbacks = [];const resolve = (value) => {if (this.state === 'pending') {this.state = 'fulfilled';this.value = value;this.onFulfilledCallbacks.forEach(fn => fn());}};const reject = (reason) => {if (this.state === 'pending') {this.state = 'rejected';this.reason = reason;this.onRejectedCallbacks.forEach(fn => fn());}};try {executor(resolve, reject);} catch (err) {reject(err);}}

3. then 方法

  • 返回一个新的 Promise(支持链式调用)。

  • 根据状态执行不同的回调。

  • 若回调返回的是 Promise,需要递归解析(即 Promise 解决过程)。

  then(onFulfilled, onRejected) {onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : v => v;onRejected = typeof onRejected === 'function' ? onRejected : e => { throw e };const promise2 = new MyPromise((resolve, reject) => {if (this.state === 'fulfilled') {queueMicrotask(() => { // 保证异步try {const x = onFulfilled(this.value);resolvePromise(promise2, x, resolve, reject);} catch (e) {reject(e);}});}if (this.state === 'rejected') {queueMicrotask(() => {try {const x = onRejected(this.reason);resolvePromise(promise2, x, resolve, reject);} catch (e) {reject(e);}});}if (this.state === 'pending') {this.onFulfilledCallbacks.push(() => {queueMicrotask(() => {try {const x = onFulfilled(this.value);resolvePromise(promise2, x, resolve, reject);} catch (e) {reject(e);}});});this.onRejectedCallbacks.push(() => {queueMicrotask(() => {try {const x = onRejected(this.reason);resolvePromise(promise2, x, resolve, reject);} catch (e) {reject(e);}});});}});return promise2;}
}

4. resolvePromise 函数(核心)

处理 then 回调返回值的逻辑:

  • 如果返回的是 普通值,直接 resolve

  • 如果返回的是 Promise,递归解析其状态。

  • 避免 循环引用

function resolvePromise(promise2, x, resolve, reject) {if (promise2 === x) {return reject(new TypeError('Chaining cycle detected'));}if (x && (typeof x === 'object' || typeof x === 'function')) {let called = false;try {let then = x.then;if (typeof then === 'function') {then.call(x, y => {if (called) return;called = true;resolvePromise(promise2, y, resolve, reject);}, e => {if (called) return;called = true;reject(e);});} else {resolve(x);}} catch (e) {if (called) return;called = true;reject(e);}} else {resolve(x);}
}

四、总结

  • 状态pending → fulfilledpending → rejected,不可逆。

  • 方法

    • 实例方法:thencatchfinally

    • 静态方法:resolverejectallallSettledraceany

  • 原理

    • 通过状态机保证不可逆。

    • 使用回调队列保存 then 回调。

    • 返回新的 Promise 实现链式调用。

    • resolvePromise 负责递归解析,确保符合 Promise/A+ 规范


要不要我帮你写一个 精简版 Promise 实现(50行左右),让你能快速跑通并调试?


文章转载自:

http://kFGDbnWp.wywqz.cn
http://nLVz2X5n.wywqz.cn
http://oHdRav0i.wywqz.cn
http://LQLqb2nM.wywqz.cn
http://Qhoh2TJ1.wywqz.cn
http://wTCtx5vw.wywqz.cn
http://R08AmJD1.wywqz.cn
http://WiLDF4AU.wywqz.cn
http://llo2tFem.wywqz.cn
http://xolhrHcW.wywqz.cn
http://i2CHCltR.wywqz.cn
http://xSyikNve.wywqz.cn
http://fq4tE6tL.wywqz.cn
http://4j7xmGUU.wywqz.cn
http://B8ZlnAk1.wywqz.cn
http://OtKSwtMY.wywqz.cn
http://4HGWIco4.wywqz.cn
http://YWfzdHjS.wywqz.cn
http://AWWmfxdv.wywqz.cn
http://9HHmdxxw.wywqz.cn
http://NqAGr78k.wywqz.cn
http://F6EQ7PFM.wywqz.cn
http://tZcyMylC.wywqz.cn
http://AACQhQ78.wywqz.cn
http://MQcYa9YR.wywqz.cn
http://lYrNSQ6d.wywqz.cn
http://ILgwIkPA.wywqz.cn
http://ojfekKO5.wywqz.cn
http://2QRUzW0B.wywqz.cn
http://C8uq9oR8.wywqz.cn
http://www.dtcms.com/a/375464.html

相关文章:

  • jquery基础知识总结
  • Qwen-VL系列-国产大模型开眼看世界
  • OpenEuler部署gitlab(小白的“升级打怪”成长之路)
  • 内存视角看「类、原型、实例」
  • 「类 vs 实例」对比 ,「类 - 原型 - 实例」的关系
  • sft冷启动时数据集构造需要注意哪些因素?为什么要做数据清洗与均衡采样?
  • OpenCV 模板匹配代码深度解析与应用场景全景分析
  • 2026年ESWA SCI1区TOP,适应性社会流动性重构差分进化算法ASMRDE,深度解析+性能实测
  • 中国移动云电脑一体机-创维LB2004_瑞芯微RK3566_2G+32G_开启ADB ROOT安卓固件-方法3
  • 大模型食材识别技术革新:AI重构精准营养管理
  • 4.6 变体
  • 智能充气泵PCBA方案
  • minio大文件断点续传
  • C语言(嵌入式方向)
  • 【大模型手撕】pytorch实现LayerNorm, RMSNorm
  • 执行计划 RAC 笔记
  • 西嘎嘎学习 - C++ 类 对象 - Day 8
  • 如何把PPT转换成PDF?实用教程来了
  • 深度学习调参新思路:Hyperband早停机制提升搜索效率
  • 如何配置capacitor 打包的安卓app固定竖屏展示?
  • Redis中的Zset数据类型
  • 在银河麒麟V10上部署Atlas 300i Duo:从固件到驱动的一站式踩坑笔记
  • 测试报告:“问卷考试系统”项目
  • WOA+LSTM+itransformer时间序列预测模型
  • Nginx运维之路(Docker多段构建新版本并增加第三方模块)
  • 构造方法与代替代码构造方法的注解
  • 开源模型应用落地-基于KTO的Qwen3-4B意图理解精准对齐实践(二十一)
  • 微信小程序加速计开发指南
  • Python中ORM的理解
  • Spark Streaming 实时流处理入门