pinia 的 action 流水线由 $onaction 钩子构建,支持在 before、after、onerror 等生命周期节点注入状态控制、日志、锁等能力,需按读/写/链式操作类型按需装配,并注意规避吞错、注册时机等断裂风险。

Pinia 的 action 执行流水线不是预设的固定流程,而是靠开发者主动组装的可扩展链条——它由 $onAction 提供生命周期钩子为骨架,以业务需求为驱动,在开始、执行中、完成、失败等关键节点注入状态控制、日志、锁、取消、隔离等能力。
用 $onAction 构建基础流水线骨架
$onAction 是流水线的中枢,它不修改 action 本身,却能监听其完整生命周期。每个订阅回调接收一个上下文对象,其中:
- before 阶段隐式存在:在 action 执行前自动触发,适合初始化 loading、生成请求 ID、校验权限
- after:Promise resolve 后执行,可读取返回值,用于更新成功状态、清理临时字段、触发通知
- onError:捕获未被吞掉的同步 throw 和异步 reject,是错误处理的统一入口
按业务类型装配流水线模块
不同 action 对流水线的要求不同,应按需组合能力模块,避免一刀切:
- 读操作(如 fetchList):接入 AbortController 取消前序请求 + 按 key 隔离 loading/error 状态 + 自动打日志标记耗时
- 写操作(如 submitForm):前置轻量锁(检查 isProcessing + key) + 全局 loading 开关 + 错误 toast + 成功后重置相关状态
- 链式操作(如 saveDraft → publish):在 after 中触发下一个 action,或通过返回 Promise 链式 await,确保顺序可控
与外部系统协同的流水线出口
流水线不只是内部状态流转,还要对接可观测性与用户体验:
- 开发阶段用
console.group折叠显示同一 action 的 before/after/onError 日志,便于调试 - 测试环境将关键事件推送到前端监控 SDK(如 Sentry breadcrumb),带 store.id 和 action.name 标识
- 生产环境过滤 debug 日志,仅上报 error 和核心 success,并附加用户 ID、traceId 等上下文
- 组件层可选择性订阅 action 返回的 Promise,实现局部反馈(如按钮 loading、表单重置)
规避流水线断裂风险
设计再完整,也容易因细节失效:
-
$onAction不监听$patch、$reset或直接赋值 state 的行为,只对 actions 方法生效 - 若 action 内部用 try/catch 吞掉错误,
onError就不会触发——流水线在此断开 - 多个
$onAction订阅按注册顺序执行,不要在 onError 中再 throw,否则中断后续监听器 - 全局流水线应在 store 创建后立即注册,避免漏掉初始化阶段的关键 action 调用










