发表于: 2019-04-19 19:57:48
1 593
今天完成的事情:(一定要写非常细致的内容,比如说学会了盒子模型,了解了Margin)
Javascript Finite State Machine 函数库
交通信号灯的模型描述:
var fsm = StateMachine.create({
initial: 'green',
events: [
{ name: 'warn', from: 'green', to: 'yellow' },
{ name: 'stop', from: 'yellow', to: 'red' },
{ name: 'ready', from: 'red', to: 'yellow' },
{ name: 'go', from: 'yellow', to: 'green' }
],
callbacks:{
callback1:function(){...},
callback2:function(){...},
...
},
error: function(){...}
});
initial选项用来表示fsm对象的初始状态,events选项用来描述fsm对象所有状态的变化规则,每一种变化规则对应一种行为。create方法为实例的每一种行为都添加了一个方法,调用这个方法就相当于触发对象的某种行为,当对象行为发生时,对象的状态就可以发生变化。如以上例子创建的实例将拥有如下行为方法:
fsm.warn() : 调用该方法,实例状态将从'green'变为'yellow'
fsm.stop() : 调用该方法,实例状态将从'yellow'变为'red'
fsm.ready() : 调用该方法,实例状态将从'red'变为'yellow'
fsm.go() : 调用该方法,实例状态将从'yellow'变为'green'
这些方法是StateMachine根据create时配置的events规则自动创建的,方法名跟events规则里面的name属性对应,events规则里面有几个不重复的name,就会添加几个行为方法。同时为了方便使用,它还添加了如下成员来判断和控制实例的状态和行为:
fsm.current - 返回实例当前的状态
fsm.is(state) - 如果传入的state是实例当前状态就返回true
fsm.can(eventName) - 如果传入的eventName在实例当前状态能够被触发就返回true
fsm.cannot(eventName) - 如果传入的eventName在实例当前状态不能被触发就返回true
fsm.transitions() - 以数组的形式返回实例当前状态下能够被触发的行为列表
Javascript Finite State Machine允许为每个事件指定两个回调函数,以warn事件为例:
onbeforewarn:在warn事件发生之前触发
onafterwarn(可简写成onwarn) :在warn事件发生之后触发。
同时,它也允许为每个状态指定两个回调函数,以green状态为例:
onleavegreen :在离开green状态时触发
onentergreen(可简写成ongreen) :在进入green状态时触发。
假定warn事件使得状态从green变为yellow,上面四类回调函数的发生顺序为:
onbeforewarn → onleavegreen → onenteryellow → onafterwarn。
还为所有的事件和状态指定通用的回调函数:
onbeforeevent :任一事件发生之前触发
onleavestate :离开任一状态时触发
onenterstate :进入任一状态时触发
onafterevent :任一事件结束后触发
以{ name: 'warn', from: 'green', to: 'yellow' }为例,这八个回调函数顺序为:
onbeforewarn
onbeforeevent
onleavegreen
onleavestate
onenteryellow
onenterstate
onafterwarn
onafterevent
在实际应用中,可能会碰到在行为触发期间,因为某些条件不允许需要取消该行为的情况,以免对象状态被错误的更改,javascript-state-machine提供了3种方式来取消行为:
在onbeforeEVENT_NAME回调中return false可以取消当前触发的行为;
在onleaveSTATE回调中return false也可以取消当前触发的行为;
在onleaveSTATE回调中return StateMachine.ASYNC来执行异步的行为。
前两种方法,在指定的回调中return false即可取消行为,第三个方法返回的仅是一个异步标识,是否取消行为需要在
异步任务的回调里面进一步指定。这个方法适用于那些带有异步任务的行为,就是说在这种行为触发的时候,并不是同时就
触发对象状态的改变,而是要等到异步任务执行完成之后再改变状态.
明天计划的事情:(一定要写非常细致的内容)
继续完成任务
遇到的问题:(遇到什么困难,怎么解决的)
暂无
收获:(通过今天的学习,学到了什么知识)
同今天完成的事情
评论