跳转到内容

其他装饰器

除了 @ChangeState,AFSM 还提供三个装饰器用于不同的状态约束场景。

@Includes —— 包含状态守卫

只允许在指定状态下调用方法。

import { Includes } from 'afsm'
class Player extends FSM {
@Includes('playing')
pause() {
// 只有在 playing 状态下才能调用
// 否则抛出 FSMError
}
}

签名:

function Includes(...states: string[]): MethodDecorator

支持多个状态:@Includes('playing', 'buffering')

@Excludes —— 排除状态守卫

不允许在指定状态下调用方法。

import { Excludes } from 'afsm'
class Player extends FSM {
@Excludes('disabled')
play() {
// 除了 disabled 状态外都可以调用
}
}

签名:

function Excludes(...states: string[]): MethodDecorator

@ActionState —— 动作态

异步执行期间临时切到某个状态,结束后回到原状态

import { ActionState } from 'afsm'
class Doc extends FSM {
@ActionState('saving')
async save() {
await persist()
// 执行期间状态为 saving,结束后回到原来的状态
}
}

签名:

function ActionState(name?: string): MethodDecorator

name 省略时,默认用方法名作为状态名。

与 @ChangeState 的区别

@ChangeState@ActionState
执行前校验 from无校验,直接切换
执行后进入新的稳定状态 to回到原状态
中间态MiddleState${action}ing直接进入 name 状态
出现在 stateDiagram

组合使用

装饰器可以叠加,但要注意执行顺序——从下往上应用:

class Service extends FSM {
@Includes('idle') // 外层:先校验状态
@ChangeState('idle', 'done') // 内层:再迁移状态
async fetch() {}
}

实际开发中通常单独使用即可。

下一步