为StateMachine注册新的状态类型。
StateMachine.registerType(typeName: string, options: Object);
typeName
:字符串类型,表示要注册的状态类型名称。options
:对象类型,表示注册的状态类型选项,包含以下属性:
data
:状态的自定义数据对象,默认为null
。onEnter
:函数类型,表示进入该状态时要执行的函数,默认为noop
函数。onLeave
:函数类型,表示离开该状态时要执行的函数,默认为noop
函数。canEnter
:函数类型,表示在进入该状态前要满足的条件,默认为始终返回true
的函数。canLeave
:函数类型,表示在离开该状态前要满足的条件,默认为始终返回true
的函数。const stateMachine = new StateMachine();
// 注册两种状态类型:"started"和"stopped"
StateMachine.registerType("started", {
data: { timestamp: null },
onEnter: function() {
this.data.timestamp = Date.now();
console.log("Started at " + this.data.timestamp);
},
canLeave: function(trigger, nextState) {
const duration = Date.now() - this.data.timestamp;
console.log("Stopped after " + duration + "ms");
return true;
}
});
StateMachine.registerType("stopped", {
onEnter: function() {
console.log("Stopped");
}
});
// 设置状态机的初始状态为"started"
stateMachine.setState("started");
// 触发"stopped"状态
stateMachine.trigger("stop");
/* output:
Started at 1627095590964
Stopped after 175ms
Stopped
*/
typeName
不能与已有的状态类型名称重复,否则会抛出Error
异常。typeName
必须是一个合法的 JavaScript 标识符。options
中的函数中的this
指向当前的状态对象。