如何获得分层 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 状态机?