xstate - как правильно обрабатывать ошибки переходов? - PullRequest
0 голосов
/ 27 января 2020

Я совершенно новичок в Xstate и изо всех сил пытаюсь найти помощь в официальной документации.

Проблема довольно проста, я хотел бы знать, если событие инициируется, когда не предполагается к.

У меня есть базовый c рабочий процесс, который очень строг с точки зрения переходов, например, мое состояние не может go с «в ожидании» до «обработано» без перехода от «загружен» .

Если я использую:

stateService.send('PROCESSED') 

, пока состояние находится в состоянии «ожидание», состояние не изменяется (корректно), но есть ли в Xstate какая-либо утилита или событие, которое фактически сообщает мне, что транзакция не была запущена, поскольку событие не было разрешено / исправлено?

Это мое состояние

const stateMachine = Machine(
  {
    id: 'vocalTrack',
    initial: 'PENDING',
    context: {},
    states: {
      PENDING: {
        on: {
          UPLOADED: 'UPLOADED',
        },
      },
      UPLOADED: {
        on: {
          PROCESSED: 'PROCESSED',
        },
        entry: 'onUploaded',
      },
      PROCESSED: {
        on: {
          READY: 'READY',
          ERROR: 'ERROR',
        },
        exit: 'onProcessed',
      },
      READY: {
        type: 'final',
      },
      ERROR: {
        on: {
          UPLOADED: 'UPLOADED',
        },
        type: 'final',
      },
    },
  },
  {
    actions: {
      onUploaded: (context, event) => {
        console.log(`++++ onUploaded action: ++++`)
      },
      onProcessed: (context, event) => {
        console.log(`++++ onProcessed action: ++++`)
      },
    },
  },
)

const stateService = interpret(stateMachine)
stateService.init('PENDING')

// I'd like to catch the following workflow errors
stateService.send('UPLOADED')
stateService.send('PROCESSED')

1 Ответ

2 голосов
/ 28 января 2020

Нет варианта, который вы можете передать на аппарат или интерпретировать вызов, который даст вам это "бесплатно". Вы можете легко добавить некоторые логи c в метод "onTransition", хотя:

Опция 1, проверка на state.changed:

    service.onTransition(state => {
        if (state.changed) {
            console.log(`The state did change, so ${state.event.type} caused a valid transition`);
        } else {
            console.log(`${state.event.type} did not cause a state change`);
        }
    })

Опция 2, проверка на основе state.value & имя события:

    service.onTransition(state => {
        if (state.event.type === 'xstate.init'){
            console.log('Init Transition');
            return;
        }
        if(state.value === state.event.type){
            console.log('Transition Valid');
        }else {
            console.log('Transition Invalid');
        }
    })

Вариант 1, вероятно, будет предпочтительным решением! Подробнее об этом можно прочитать здесь в документации. Следующий SO вопрос также связан с событиями, которых вообще нет.

Я создал небольшое демонстрационное приложение, чтобы продемонстрировать это:

Edit cranky-silence-934uu

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...