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

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

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

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

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

【问题讨论】:

    标签: javascript state-machine xstate


    【解决方案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

      【讨论】:

        猜你喜欢
        • 2021-06-09
        • 2020-09-08
        • 2021-06-07
        • 1970-01-01
        • 1970-01-01
        • 2019-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多