1

假设我们有以下简化的分层xstate机器......

const HFSM = Machine({
  initial: 'init',
  states: {
    init: {
      initial: 'leaf'
    }
  }
});

...获得其初始状态的最佳方法是什么?

请注意,HFSM.initial返回我'init'而不是{init: 'leaf'}

4

2 回答 2

1

我们可以在protoconsole.log(HFSM)属性中看到这个状态机的属性,以及它的方法。初始状态在 HFSM.initialState 上,如果值是我们要找的,那就是HFSM.initialState.value

登录控制台,观察返回对象的属性:

HFSM.getInitialState()= 机器的初始状态,尚未启动,未进行任何转换尝试
- changed: undefined
- value: {}
-event: {type: "xstate.init"}

HFSM.initialState
- changed: undefined
- value: {init: "leaf"}
-event: {type: "xstate.init"}

HFSM.transition(HFSM.initialState, 'FAKE_EVENT')= 尝试使用假事件从初始状态(不是状态名称- https://xstate.js.org/docs/guides/transitions.html#machine-transition-method)转换,所以什么都不做,并保持在状态机器试图从
- changed: false
- value: {init: "leaf"}
-过渡event: {type: "FAKE_EVENT"}

HFSM.transition(HFSM.initialState, 'REAL_EVENT')
- changed: true
- value: {init: "leaf2"}
-event: {type: "REAL_EVENT"}


从 xstate.js 版本 4.0 开始,看起来我们可以使用解释器,它可以“跟踪当前状态”以及其他有用的东西。https://xstate.js.org/docs/guides/interpretation.html#interpreter

所以一旦这个服务被初始化:我们可以通过:或const serv = interpret(HFSM) 获得初始状态。serv.start()serv.init()

serv.start() === serve.init() // true

于 2019-07-22T15:07:13.910 回答
0

我解决这个问题的方法是调用一个虚假的转换:

const currentState = HFSM.transition(HFSM.initial, "fake").value;
于 2018-09-06T16:25:31.003 回答