默认情况下,状态机只跟踪其当前状态。如果希望跟踪状态历史记录,可以使用state-machine-history插件来扩展状态机。
var StateMachineHistory = require('javascript-state-machine/lib/history')
复制代码
var fsm = new StateMachine({
init: 'A',
transitions: [
{ name: 'step', from: 'A', to: 'B' },
{ name: 'step', from: 'B', to: 'C' },
{ name: 'step', from: 'C', to: 'D' }
],
plugins: [
new StateMachineHistory() // <-- plugin enabled here
]
})
fsm.history; // [ 'A' ]
fsm.step();
fsm.history; // [ 'A', 'B' ]
fsm.step();
fsm.history; // [ 'A', 'B', 'C' ]
fsm.clearHistory();
fsm.history; // [ ]
复制代码
回溯历史记录
你可以使用 historyBack
和historyForward
方法来回溯:
var fsm = new StateMachine({
init: 'A',
transitions: [
{ name: 'step', from: 'A', to: 'B' },
{ name: 'step', from: 'B', to: 'C' },
{ name: 'step', from: 'C', to: 'D' }
]
})
fsm.step();
fsm.step();
fsm.step();
fsm.state; // 'D'
fsm.history; // [ 'A', 'B', 'C', 'D' ]
fsm.historyBack();
fsm.state; // 'C'
fsm.history; // [ 'A', 'B', 'C' ]
fsm.historyBack();
fsm.state; // 'B'
fsm.history; // [ 'A', 'B' ]
fsm.historyForward();
fsm.state; // 'C'
fsm.history; // [ 'A', 'B', 'C' ]
复制代码
可以使用以下属性测试是否允许历史遍历
fsm.canHistoryBack; // true/false
fsm.canHistoryForward; // true/false
复制代码
一套完整的生命周期事件在遍历历史记录的historyBack
和historyForward
中依旧适用。
设置历史记录上限
默认情况下,状态机历史记录是无限的,并且将继续增长的,直到清除为止。通过配置插件,可以将存储限制在最后的N个状态:
var fsm = new StateMachine({
plugins: [
new StateMachineHistory({ max: 100 }) // <-- plugin configuration
]
})
复制代码
自定义历史记录
如果history
这个术语与现有的状态机属性或方法冲突,可以使插件具有不同名称:
var fsm = new StateMachine({
init: 'A',
transitions: [
{ name: 'step', from: 'A', to: 'B' },
{ name: 'step', from: 'B', to: 'C' },
{ name: 'step', from: 'C', to: 'D' }
],
plugins: [
new StateMachineHistory({ name: 'memory' })
]
})
fsm.step();
fsm.step();
fsm.memory; // [ 'A', 'B', 'C' ]
fsm.memoryBack();
fsm.memory; // [ 'A', 'B' ]
fsm.memoryForward();
fsm.memory; // [ 'A', 'B', 'C' ]
fsm.clearMemory();
fsm.memory; // [ ]
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END