@awefeng/state-machine
v1.1.2
Published
TS实现的状态机,包含FSM
Downloads
10
Maintainers
Readme
state-machine
TS实现的简单状态机,目前支持
FSM(finite state machine)
introduction
用TS实现了一个简单的状态机,目前仅支持FSM
状态机,后续会增加其他类型状态机。
支持commonjs
和es moudle
两种规范。
install
npm i @awefeng/state-machine
Finite State Machine
定义: 有限状态机。
示例: FSM Demo
初始化一个FSM
- 从包中引入
FiniteStateMachine
- 初始化一个
FSM
对象,其中state
和transitions
为必填项,onTransiteError
为转换过程出现错误时的回调函数 state
为默认状态transitions
为各状态之间的关系:from
状态通过event
时间到达下一状态to
import { FiniteStateMachine } from '@awefeng/state-machine'
const fsm = new FiniteStateMachine({
state: 'opened', // 默认状态
transitions: [{
// 门开启时关门流程,从状态“门开着的”通过事件“关门”到达下一状态“门关着的”
{ event: 'close', from: 'opened', to: 'closed' },
{
event: 'open',
from: 'closed',
to: 'opened',
// beforeTransite 状态过渡前的回调函数,参数from,to,event
beforeTransite: ({ from, to, event }) => {},
// afterTransite 状态过渡后的回调函数,参数from,to,event
afterTransite: ({ from, to, event }) => {},
// 状态过渡的完以后需要执行的事件(某种意义上和afterTransite是一样的)
action: ({ from, to, event }) => {}
}
}],
// 转换状态时错误兜底函数
onTransiteError: ({from, to, event}) => console.log
})
API
fsm.getState()
获取当前所在状态,返回值为当前state
fsm.setState(state)
设置当前状态,该API不会调用任何回调,只是单纯设置状态
fsm.getStateTransitions()
获取当前状态下可以进行的转换,返回值为部分transitions
fsm.canTransite(event)
获取当前状态下是否可以进行某一event
的转换,返回值为boolean
类型。例:state
在'closed'
状态下,fsm.canTransite('close') //false
fsm.getHistory()
获取状态改变的历史数据,返回值为一个数组{from: string, to: string, event: string, type :'setState' |'transite'}[]
,其中type指的是通过setState
改变或者通过transite
改变。
fsm.transite(event?)
转换状态,将当前状态转换到下一状态,返回值为boolean
类型,转换成功为true
,失败为false
。
如果关系图中当前状态没有传入的event
关系,则转换失败。
如果当前状态下,该event
只有一个关系图时,可以不传入event
,因为是唯一的;如果不是唯一的(即当前状态对应多个下一状态),则必须指定event
,否则转换失败。
欢迎贡献
非常欢迎!提一个Issue 或者提交一个 Pull Request。