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