@ChangeState
签名
function ChangeState( from: string | string[], to: string, opt?: ChangeOption): (target: any, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<any>) => void参数
from: string | string[]
允许的起始状态。
| 取值 | 含义 |
|---|---|
'idle' | 仅 'idle' 可调用 |
['a', 'b'] | 'a' 或 'b' 均可 |
FSM.INIT | 即 '[*]',初始状态 |
[](空数组) | 任意状态均可,且会中断进行中的 MiddleState |
不匹配时抛出 FSMError:
{className} {action} to {to} failed: current state {state} not from {from}to: string
目标状态。成功迁移后的稳定状态名。
opt?: ChangeOption
详见 ChangeOption。
装饰行为
被装饰的方法被替换为以下流程:
- 若
opt.context设置,fsm = FSM.get(context)(组合模式) - 若当前已是
to:直接返回(异步模式Promise.resolve(cached),同步模式返回cached) - 若当前是
MiddleState且opt.abortAction匹配:调用middle.abort(fsm) - 校验
from,不匹配则返回错误(reject / 抛出 / 返回,取决于ignoreError与sync) - 创建
MiddleState(old, to, action),调用setState(middle)(进入中间态) - 执行原方法
- 返回 Promise:
.then(success).catch(failed) - 返回同步值:
success(result)(异步模式包Promise.resolve,同步模式直接返回)
- 返回 Promise:
success:缓存结果,若未被 abort 则setState(to),触发opt.successfailed:setState(old, err),触发opt.fail,返回错误
stateDiagram 元数据
@ChangeState 在应用时会向模块级 stateDiagram Map 注册 {from, to, action} 元数据(仅当未设置 opt.context 时),供 FSM.prototype.stateDiagram getter 生成 mermaid 边。
示例
class Conn extends FSM { @ChangeState(FSM.INIT, 'connected', { action: 'connect', success: (r) => console.log('connected'), fail: (e) => console.error(e) }) async connect() { return await api() }}