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

Posted

技术标签:

【中文标题】如何获得分层 xstate 机的初始状态?【英文标题】:How to get the initial state of a hierarchical xstate machine? 【发布时间】:2019-02-11 23:28:52 【问题描述】:

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

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

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

请注意,HFSM.initial 会返回“init”而不是 init: 'leaf'

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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')= 尝试从初始 state (不是状态 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

【讨论】:

以上是关于如何获得分层 xstate 机的初始状态?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法使用从 Firebase 返回的承诺来初始化 Xstate 状态机?

如何在反应中保持 Xstate 状态机中的状态?

有没有办法在 useEffect 的反应组件中设置 xstate 机器的状态?

XState Viz 可视化和调试状态机

XState Viz 可视化和调试状态机

XState Viz 可视化和调试状态机