我对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')
答案 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也与根本不存在的事件相关。
我已经创建了一个小型演示应用程序以对此进行演示: