js有限状态机08:记录历史状态

默认情况下,状态机只跟踪其当前状态。如果希望跟踪状态历史记录,可以使用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;        // [ ]

复制代码

回溯历史记录

你可以使用 historyBackhistoryForward方法来回溯:

  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
复制代码

一套完整的生命周期事件在遍历历史记录的historyBackhistoryForward中依旧适用。

设置历史记录上限

默认情况下,状态机历史记录是无限的,并且将继续增长的,直到清除为止。通过配置插件,可以将存储限制在最后的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
喜欢就支持一下吧
点赞0 分享