状态机的使用
来源:https://github.com/jakesgordon/javascript-state-machine
使用方法:require状态机模块,new一个状态机对象,并且传入一个对象,对象可以定义几个属性,其中有Transitions,methods,init,data等。
Transitions是一个数组,数组中放入{name:'toYellow',from:'green',to:'yellow'},这样形式的元素,代表着一个变化,名字是toYellow,从green变成yellow。methods是方法,是状态切换的时候自动调用的,顺序为onBeforeTransition--onLeaveState--onTransition--onEnterState--onAfterTransition。也可以定义为onBeforeToYellow--onLeaveGreen--onTransition--onEnterYellow--onAfterToYellow这样的形式。init为初始状态,如果有,new一个状态机对象的时候,会自动从none转换为定义的初始状态,相应的方法也会被调用。data用来存放使用者自定义的变量,比如
var StateMachine = require('state-machine');
var fsm = new StateMachine({
init:'green',
Transitions:[
{name:'toYellow',from:'green',to:'yellow'},
],
methods: {
onBeforeTransition: function (lifecycle) { },
onLeaveState: function (lifecycle) { },
onEnterState: function (lifecycle) { },
onAfterTransition: function (lifecycle) { },
onTransition: function (lifecycle) { },
});
fsm.is(s) - 如果当前状态是传入的状态,返回true。
fsm.can(t) - 如果可以执行该transition,返回true。
fsm.cannot(t) - 如果不可以执行该transition,返回true。
fsm.transitions() - 返回当前状态可以调用的transition,类型数组
fsm.allTransitions() - 返回所有可用的transition。
fsm.allStates() - 返回所有能够转换的状态。
在methods中不能直接调用fsm.can(t) 和fsm.cannot(t) ,可能是因为状态还没转换完成,使用setTimeout(function(){},0)就没问题了。
用cocoscreator实现的红绿灯:https://pan.baidu.com/s/1jJiFnIu
网友评论