背景介绍:
状态机是什么?
其实更偏向于一种思想,基本上世间的每种事物都有其状态和状态的改变,在我现在的认知中,没有什么东西是一成不变的,抽象的事情和具体的事物都会根据不同的行为而发生改变,这个行为有可能是被动,也有可能是主动的;抽象的好比说爱情吧,可能昨天你和女朋友还恩恩爱爱,今天就分手了,现在爱情这个状态就由’恩爱’到’分手’,促使状态改变的这个行为有可能是你出轨了或者你女朋友出轨了;
同样,这个思想也可以具体到我们生活中的很多地方;
比如说最简单的红绿灯,这个红绿灯的颜色(红、黄、绿)就是’红绿灯’这件事物的三个状态;这个三个状态中有一个是初始值,这个初始值也有可能是其他的状态,这里就把绿灯当做这个初始值;
当’警告’这个行为发生的时候,状态从绿灯转换至黄灯;带背景颜色的圆圈就是 行为, 行为会触发状态的改变;
使用有限状态机库:
打开github上函数库的地址,fork到自己的库中,下载到本地;
https://github.com/jakesgordon/javascript-state-machine
找到dist文件夹中的’state-machine.js’或者min.jd(压缩版) , 引用到HTML文档中,引用方式和引用常规js文件一样;
var fsm = new StateMachine({//创建一个状态机实例,
init: 'A', //初始值为A
transitions: [{//描述状态变化规则的数组,{}中的每一项是一个对象,是一个规则描述
name: 'step',//当前行为的名字,状态机是通过这个name来进行转换的
from: 'A',//当前行为是从哪个状态来的
to: 'B' //当前行为执行完以后会过渡到哪个状态
},
{
name: 'reset',
from: 'B',
to: 'C'
}, {
name: 'come',
from: 'C',
to: 'A'
}
],
methods: {
/* 如果没有下面的报错处理机制,当不按转换顺序,状态机会报错并停止运行程序; */
onInvalidTransition: function (transition, from, to) {
// console.log(from);
switch (from) {
case "A":
alert("请点击A");
break;
/* 如果首先是调用step()的话,到这里的状态已经从A转换为B了,但是如果直接调用的是reset()方法,当前状态还是A,因为没有进行状态的转换,状态机会抛出错误:
transition = "reset", from = "A", to = undefined;