状态守卫(state guard) 前端与交互

别名: 状态守卫

reducer 里每个处理函数的第一道检查:`if (state.status !== 'streaming') return state;`——不合法的事件原样丢弃。它「只认状态、不认来源」,是打断残留、重复事件、乱序事件在 UI 层的最后防线。

它是什么

状态守卫(state guard)是 reducer 里每个处理函数的第一道检查:if (state.status !== 'streaming') return state;——不合法的事件原样返回(丢弃)。它「只认状态、不认来源」:不管是哪个连接的哪条流推来的事件,只要当前状态不合法,一律不收。

它是哪几类事故的最后防线

打断残留:用户点「停止生成」后状态机进 interrupted,但已经发出、已进 TCP 缓冲的 text_delta 还会陆续到达——onTextDelta/onToolCallStart/onToolResult/onApprovalRequest/onApprovalResult 只认 streaming/waiting_approval,残留事件自然全部被丢弃,只有旧流的 done/error 能关闭回合。重复事件:同一个 done 到达两次,第二次状态已是 done,被守卫拒绝。乱序事件:不属于当前状态的事件无法生效。传输层 AbortController.abort() 管「不再来」,状态守卫管「来了也不收」,双保险。

与幂等的关系

ch16 说过「重复投递是协议特性、幂等是客户端责任」——状态守卫就是前端幂等的落点之一:tool_result 只解析第一个匹配且仍为 running 的块、approval_result 必须 requestId 匹配、done 只在 streaming/waiting_approval/interrupted 生效,都是「重复到达无害」的落实。凡是可能乱的事件,都要带身份(callId/requestId)+ 状态守卫。

在本教程的位置

第 17 章「reducer 骨架」与「打断:丢弃旧流」两节;它是UI 状态机的组成部分。

相关词条

出现在这些章节