如何获得分层xstate机器的初始状态?

时间:2018-09-06 16:25:31

标签: javascript state-machine xstate

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

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

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

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

2 个答案:

答案 0 :(得分:1)

console.log(HFSM),我们可以在 proto 属性中看到此状态机的属性及其方法。初始状态位于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') =尝试从初始状态(不是状态 name -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

答案 1 :(得分:0)

我解决这个问题的方法是调用一个伪造的过渡:

const currentState = HFSM.transition(HFSM.initial, "fake").value;