JavaScript构造函数中实现轻量级状态机,需封装state、transitions和actions,用goTo校验转移合法性,提供语义化方法如start(),支持onEnter/onExit钩子及简易监听机制。

在 JavaScript 构造函数中实现轻量级状态机,核心是把状态(state)、状态转移逻辑(transitions)和动作(actions)封装进实例,用 this.state 记录当前状态,用方法(如 transition() 或具名事件方法)触发受控的状态变更,并可选地执行进入/退出状态的副作用。
定义状态与合法转移规则
状态机必须明确“有哪些状态”和“哪些状态之间可以跳转”。推荐用常量对象或 Object.freeze 固定状态集,再用映射对象(如 transitions)声明每个状态允许的下一状态:
- 例如:const STATES = Object.freeze({ IDLE: 'IDLE', LOADING: 'LOADING', SUCCESS: 'SUCCESS', ERROR: 'ERROR' });
- const TRANSITIONS = { IDLE: ['LOADING'], LOADING: ['SUCCESS', 'ERROR'], SUCCESS: ['IDLE'], ERROR: ['IDLE'] };
- 构造函数中初始化
this.state = STATES.IDLE,并保存this.transitions = TRANSITIONS供后续校验
封装安全的状态变更方法
不直接修改 this.state,而是提供一个带校验的 goTo(state) 方法:先检查目标状态是否在当前状态的允许转移列表中,再更新状态并触发钩子:
- 检查逻辑:if (!this.transitions[this.state]?.includes(nextState)) throw new Error(...);
- 更新前调用
this.onExit?.(this.state),更新后调用this.onEnter?.(nextState)(可绑定自定义回调) - 支持链式调用可返回
this,便于组合操作
为常用事件提供语义化方法
比起暴露裸的 goTo(),更推荐按业务意图封装方法,比如 start()、complete()、fail(),内部调用 goTo() 并确保状态流符合预期:
- start() { return this.goTo(STATES.LOADING); }
- success() { return this.goTo(STATES.SUCCESS); }
- reset() { return this.goTo(STATES.IDLE); }
- 这些方法天然限制了调用上下文(比如不能在
IDLE时调用success()),提升可读性与安全性
可选:支持状态监听与调试
轻量不等于无可观测性。可在构造函数中添加简单事件机制,比如维护一个 this.listeners = [],并在 goTo() 中触发 onStateChange(from, to):
- 监听器可通过
on('statechange', handler)注册,便于日志、埋点或联动 UI - 调试时打印状态变化路径(如 console.log(`→ ${to} (from ${from})`))能快速定位非法跳转
- 避免过度设计:不用引入 EventEmitter 类,数组 +
forEach足够轻量
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











