如何在XState并行状态waitingForB完成后返回idle初始状态?
XState并行状态完成后返回初始状态的实现方案
你的需求是让并行状态waitingForB在所有子任务(waitingForC和waitingForD)完成后回到idle状态,这里需要调整并行状态的结构,利用XState的**终态(final state)**和并行状态的完成机制来实现:
修改后的状态机代码
idle: { id: 'initialState' }, waitingForA: { invoke: { /*Promise*/ }, onDone: { target: 'idle' }, onError: { actions: () => alert('出错了') } }, waitingForB: { type: 'parallel', states: { waitingForC: { invoke: { /*Promise*/ }, onDone: { target: 'waitingForC.done', actions: assign({ CreturnCode: (context, event) => event.data }) }, done: { type: 'final' } // 定义waitingForC的终态 }, waitingForD: { invoke: { /*Promise*/ }, onDone: { target: 'waitingForD.done', actions: assign({ DreturnCode: (context, event) => event.data }) }, done: { type: 'final' } // 定义waitingForD的终态 } }, onDone: { target: 'idle' } // 所有并行子状态完成后,转移到idle }
关键说明
- 并行状态的终态机制:每个并行子任务完成后进入各自的终态(标记
type: 'final'),当所有子状态都到达终态时,XState会自动触发并行状态的onDone事件。 - 直接转移到初始状态:在
waitingForB上定义onDone并指定目标为idle,就能实现所有子任务完成后自动回到初始状态。 - 原代码问题修正:
onError的写法不符合XState规范,需要用actions包裹执行逻辑- 原代码将
success作为并行子状态不合理,并行子状态会同时活跃,无法作为双任务完成后的统一出口,改用终态机制才是符合XState设计的正确方式
可选:基于返回结果判断转移
如果需要根据CreturnCode和DreturnCode的结果决定是否回到idle(比如仅当两个返回码都符合条件时转移),可以在onDone中添加守卫(guard):
waitingForB: { type: 'parallel', // 子状态部分同上 onDone: { target: 'idle', cond: (context) => { // 自定义判断逻辑,示例:两个返回码都为成功状态 return context.CreturnCode === 'success' && context.DreturnCode === 'success'; }, else: { target: 'someErrorState' } // 不符合条件时转移到其他状态 } }
内容的提问来源于stack exchange,提问作者SoftwareDveloper
相关产品推荐
相关产品推荐

