Proxy 不能直接拦截异步操作,但能捕获其引发的同步状态变更;通过将异步动作声明式绑定到 Proxy.set,统一管控、快照、回滚与补偿,所有状态更新必须经 commit 接口触发 set 拦截器,并在其中记录带语义标记的快照及 undo 函数,实现同步、可追溯、可补偿的状态管理。

Proxy 本身不能直接拦截异步操作(比如 await fetch() 或 setTimeout),但它能精准捕获异步动作所引发的**同步状态变更行为**——这才是实现“异步操作拦截”语义的关键。真正要拦截的,不是异步过程本身,而是它对状态对象产生的副作用(如赋值、更新字段)。通过把异步调用“声明式绑定”到受控的 Proxy.set 上,就能在状态写入环节统一管控、快照、回滚和补偿。
把异步动作转为“变更意图”,不在回调里直接改 state
避免在 .then 或 async/await 块中直接修改原始对象或 proxy 状态。取而代之的是:定义一个可调度的变更指令,由统一入口触发 Proxy.set。
- 例如:
commit('user.status', 'loading')返回 Promise,内部封装 API 请求;成功后才调用proxy.user.status = 'success',失败则跳过 set - 所有异步结果都必须经过这个 commit 接口,确保每次状态变更都落在 Proxy 的
set拦截器内 - 这样,异步的“时机不可控”被转化为“变更可控”,Proxy 就能稳定捕获每一次有效写入
在 set 拦截中自动快照 + 标记业务语义
每次 set 被触发时,并不只是更新值,还要记录上下文,为后续回滚提供依据:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 用
WeakMap或栈结构保存当前快照(只 shallow clone 变更路径上的父级对象,不深拷贝全量) - 给快照打上标记:比如
{ step: 'submitForm', stage: 'payment', sessionId: 'abc123' } - 快照中可附带
undo函数,如() => api.cancelOrder(id),用于回滚时触发补偿
用版本号驱动回滚,而非等待异步完成
回滚动作不依赖异步是否结束,而是基于已记录的快照链进行还原:
- 步骤级回滚:回到上一次 commit 对应的快照(即上一个
set触发点) - 阶段级回滚:跳转到最近一个标记为
stage: 'addressConfirmed'的快照 - 会话级回滚:清空该 sessionId 下所有快照,恢复初始加载态
- 整个过程是同步的,不卡 UI,也不需等待任何 pending 异步任务
配合副作用管理,让回滚真正“生效”
仅还原内存状态不够,已发出的请求、发送的短信、扣减的库存等外部副作用必须补偿:
- 每次 commit 可选传入
sideEffect: { before: () => {}, after: () => {}, undo: () => {} } -
before在请求发起前执行(如锁库存);after在成功后执行(如发通知);undo在回滚时执行(如释放库存) - Proxy 不负责执行这些函数,但会在快照中持有引用,rollback 时自动调用对应
undo

















