Как получить начальное состояние иерархической машины 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;
Другие вопросы по тегам