有限状态机
一、简要介绍
有限状态机(模拟电路,有开启和断开两个状态)
- 状态总数(state)是有限的。
- 任一时刻,只处在一种状态之中。
- 某种条件下,会从一种状态转变(transition)到另一种状态。
举例:菜单鼠标悬停:菜单显示,鼠标移开:菜单隐藏。
var menu = {
// 当前状态
currentState: 'hide',
// 绑定事件
initialize: function() {
var self = this;
self.on("hover", self.transition);
},
// 状态转换
transition: function(event){
switch(this.currentState) {
case "hide":
this.currentState = 'show';
doSomething();
break;
case "show":
this.currentState = 'hide';
doSomething();
break;
default:
console.log('Invalid State!');
break;
}
}
};
优势: 逻辑清晰,表达力强,有利于封装事件。一个对象的状态越多,发生的事件越多,越适合采用有限状态机写法。实际上promise也可以用有限状态机模型实现。
import StateMachine from "javascript-state-machine";
// 状态机模型
let fsm = new StateMachine({
init: "pending",
transitions: [
{
name: "resolve", from: "pending", to: "fulfilled" },
{
name: "reject",
from: "pending",
to: "rejected"
}
],
methods: {
onResolve: function(state, data) {
// state - 当前状态机实例,data - fsm.resolve(xxx)
data.successList.forEach(fn=>fn())
},
onReject: function(state, data) {
data.failList.forEach(fn=>fn())
}
}
});
// 定义Promise
class MyPromise {
constructor(fn) {
this.sucessList = []
this.failList = []
fn(
function() {
// resolve函数
fsm.resolve(this)
},
function() {
// reject函数
fsm.reject(this)
}
);
then(successFn, failFn){
this.successList.push(successFn)
this.failList.push(failFn)
}
}
}
// 测试代码
function loadImg(src) {
const promise = new Promise(function(resolve, reject) {
let img = document.createElement("img");
img.onload = function() {
resolve(img);
};
img.onerror = function() {
reject();
};
img.src = src