Как получить начальное состояние иерархической машины xstate?
Предполагая, что мы имеем следующую упрощенную иерархическую xstate
машина...
const HFSM = Machine({
initial: 'init',
states: {
init: {
initial: 'leaf'
}
}
});
... каков наилучший способ получить его начальное состояние?
Обратите внимание, чтоHFSM.initial
возвращает мне 'init', а не{init: 'leaf'}
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')
= пытается перейти из начального состояния (не имени состояния - https://xstate.js.org/docs/guides/transitions.html) с поддельным событием, поэтому ничего не делает и остается в этом состоянии машина пыталась перейти с
-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.
Итак, как только эта служба инициализирована: const serv = interpret(HFSM)
мы можем получить начальное состояние с помощью: serv.start()
или serv.init()
.
serv.start() === serve.init() // true
Способ, которым я подошел к этому, состоял в том, чтобы вызвать поддельный переход:
const currentState = HFSM.transition(HFSM.initial, "fake").value;