xstate-如何正确处理转换错误?

时间:2020-01-27 19:02:09

标签: xstate

我对Xstate完全陌生,我正努力在官方文档中寻求帮助。

问题很容易,我想知道是否在不应该触发的情况下触发事件。

我有一个非常严格的基本工作流程,例如,过渡要严格,例如,我的状态不能从“待处理”变为“已处理”,而不能从“已上传”传递过来。

如果我使用:

stateService.send('PROCESSED') 

当状态处于“待定”状态时,状态不会改变(正确),但是Xstate中是否有任何实用程序或事件实际上告诉我由于未允许/纠正事件而未触发事务? / p>

这是我的状态

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 个答案:

答案 0 :(得分:3)

没有任何选项可以传递给计算机或解释呼叫,这将使您“免费”使用。您可以轻松地向“ 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可能是首选解决方案!您可以在文档中here了解更多信息。以下SO question也与根本不存在的事件相关。

我已经创建了一个小型演示应用程序以对此进行演示:

Edit cranky-silence-934uu