Пусть машина xstate получает событие и обновляет контекст (но не меняет состояние) независимо от того, в каком состоянии она находится.

По сути, у меня есть куча разных состояний. Я хочу, чтобы машина могла получать и обновлять контекст извне через событие (независимо от того, в каком состоянии она находится). Я нашел эту ссылку, в которой говорится, что события могут быть корневым уровнем... Используя xstate, можно ли настроить событие, которое применимо во всех состояниях и обрабатывается одинаково во всех состояниях и подсостояниях?

Но я также, кажется, помню, как new assigns() на самом деле не вступают в силу, пока не изменится состояние.


person Jared Smith    schedule 25.11.2020    source источник
comment
Что вы подразумеваете под вступить в силу? Вы ожидаете, что служба будет вызвана? Или подписчик должен быть уведомлен об изменениях контекстного состояния?   -  person chautelly    schedule 29.11.2020
comment
В основном я хотел иметь возможность получать событие в любом состоянии, а контекст обновляться событием и быть доступным в этом состоянии без дополнительных изменений состояния.   -  person Jared Smith    schedule 08.12.2020


Ответы (1)


Я не знаю, задокументировано ли это где-либо, но, казалось бы, хорошее решение, о котором я узнал на форумах xstate, заключалось в переходе на верхний уровень.

{
initial: 'Idle',
    on: {
      NEW_BLOCK: {
        actions: assign({
          block: 'addNewBlock'
        }),
        internal: true,
      },
    },
    states: {
      Idle: {},
      StateOne: {},
      StateTwo: {},
    }
}

Это приведет к тому, что вся машина всегда будет отслеживать событие «NEW_BLOCK» и добавит его в контекст, независимо от того, происходит ли событие во время простоя, StateOne, StateTwo или любых других состояний, которые вы можете добавить. Это вызовет самопереход для любого состояния, в котором находится машина. Но обновленный контекст будет сразу же доступен после этого.

person Jared Smith    schedule 08.12.2020