Javascript与有限状态机的详细解释

总之,它有三个特点:
复制代码代码如下所示:
*国家总数(国家)有限。
*在任何时刻,只有在一个国家。
*在某些条件下,它将从一种状态转换到另一种状态(转换)。


它对Javascript的意义是,许多对象可以写成一个有限状态机。

例如,网页上有一个菜单元素。当鼠标悬停时,菜单显示;当鼠标被删除时,菜单被隐藏。如果使用有限状态机描述,菜单只有两个状态(显示和隐藏),鼠标可以引起状态改变。

代码可以编写如下:

复制代码代码如下所示:
var菜单{ {

当前状态
现状:'hide,

绑定事件
初始化:函数(){
var =;
Self.on(悬停
},

状态转换
转换:函数(事件){
开关(这个现状){
案例隐藏:
this.currentstate = 'show;
DoSomething();
打破;
案例显示:
this.currentstate = 'hide;
DoSomething();
打破;
违约:
console.log('invalid状态!;
打破;
}
}

};


正如你所看到的,有限状态机被写入,逻辑清晰,表达力强,有利于包事件,对象的状态越多,发生的事件越多,更适合有限状态机的使用。

此外,Javascript语言是一种具有许多异步操作的语言。通常的解决方案是指定回调函数,但它会导致代码结构混乱,难以测试和调试,有限状态机提供了一种更好的方法来将异步操作与对象状态的变化联系起来。当异步操作结束时,将发生相应的状态更改,然后触发其他操作。这比回调函数、事件侦听器、发布/订阅和其他解决方案更合理、更容易减少代码的复杂度。

下面介绍了有限状态机的函数库,Javascript有限状态机,这个库很好理解,可以帮助我们加深理解,功能也不弱。

标准库提供了一个全局对象的状态机,以创建生成一个有限状态机的对象的一个实例方法。

复制代码代码如下所示:
var = statemachine.create(FSM);


当生成时,需要提供一个参数对象来描述实例的性质:

复制代码代码如下所示:
VaR的FSM = statemachine.create({

初始:绿色的,

事件:{
{姓名:'warn ',从绿色:''},
{姓名:停止',:'','},
{姓名:准备,:',''},
{姓名:'走',:'',‘绿色'}:
}
});


交通灯(初始)的初始状态是绿色的,事件属性是触发状态变化的各种事件。例如,警告事件使绿色状态变成黄色状态,停止事件使黄色状态变成红色状态等等。

在生成实例之后,可以随时查询当前状态。

复制代码代码如下所示:
* fsm.current:返回当前状态。
* fsm.is():返回一个布尔值,指示是否是国家的当前状态。
* fsm.can(E):返回一个布尔值,指示事件E可以在当前状态触发。
* fsm.cannot(E):返回一个布尔值,指示事件E不能在当前状态触发。

Javascript有限状态机允许为每个事件指定两个回调函数,作为警告事件的一个示例:

复制代码代码如下所示:
* onbeforewarn:触发事件发生前的警告。
* onafterwarn(简称onwarn):该警告事件发生后触发。


同时,它还允许为每个状态指定两个回调函数,以绿色状态为例:

复制代码代码如下所示:
* onleavegreen:触发时,绿色的状态是离开。
* onentergreen(缩写为绿色):触发时,进入绿色状态。


假定警告事件使国家从绿色变为黄色,对回调函数的四种以上的顺序如下:onbeforewarn,onleavegreen,onenteryellow,onafterwarn。

除了为每个事件和状态分别指定回调函数外,还可以为所有事件和状态指定一个通用回调函数。

复制代码代码如下所示:
* onbeforeevent:触发任何事件发生之前。
* onleavestate:触发你留下任何状态时。
* onenterstate:触发时,进入任何国家。
* onafterevent:通过任何事件的结束引发。


如果在事件的回调函数中有异步操作,例如与服务器的Ajax通信,那么我们可能希望等到异步操作结束,然后改变状态。

复制代码代码如下所示:
fsm.onwarn =函数(){
light.fadeout(慢,函数(){(){
fsm.transition();
});
返回statemachine.async;
};


在上面的代码中的回调函数,这是一个异步操作(光。淡出)。如果你不想要的状态立即改变,让回调函数返回一个statemachine.async对象,说明状态不改变暂时。在异步操作结束之前,调用转换方法使状态发生变化。

Javascript有限状态机还允许您指定一个错误处理函数,该函数在当前状态下不可能发生的事件时自动触发。

复制代码代码如下所示:
VaR的FSM = statemachine.create({

错误:函数(事件,,,参数,错误代码,错误信息){
return'event +事件+:+错误信息;
},

});


例如,当前状态是绿色的,理论上可能只有警告事件可能发生。如果此时发生停止事件,则触发上面的错误处理函数。