You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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
}

关键说明

  1. 并行状态的终态机制:每个并行子任务完成后进入各自的终态(标记type: 'final'),当所有子状态都到达终态时,XState会自动触发并行状态的onDone事件。
  2. 直接转移到初始状态:在waitingForB上定义onDone并指定目标为idle,就能实现所有子任务完成后自动回到初始状态。
  3. 原代码问题修正:
    • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 14:30:42