Skip to content

[v2] 工作流切换竞态:只有最后一次选择生效 - #371

Open
TannyXie wants to merge 1 commit into
ora-space:mainfrom
TannyXie:fix/1139-workflow-switch-race
Open

TannyXie wants to merge 1 commit into
ora-space:mainfrom
TannyXie:fix/1139-workflow-switch-race

Conversation

@TannyXie

@TannyXie TannyXie commented Nov 13, 2026 •

Copy link
Copy Markdown
Contributor

Refs ora-space/circus#1139

问题

侧栏快速连点两个工作流时,两条 selectWorkflow 并发:各自 await 自己的 flush,最终选中取决于两次保存谁先 resolve,不一定是用户最后点的;先返回的一条还会提前解除编辑区的 inert。

修复

selectWorkflow 引入单调递增的 workflowSwitchGeneration token:

  • 每次调用先 ++generation,记为本次的 token;
  • flush 返回后若 token !== 当前最新 token,说明有更新的选择,直接 return——不改选中、不解除 inert,把切换权交给最新那次;
  • 只有最新那次允许切换选中并解除 inert;
  • 最新那次保存失败仍留在原工作流、不丢草稿(保持 cloud#360 行为)。

这样只有最后一次选择生效,切换完成前编辑区一直 inert。exportLibraryWorkflow 在 selectWorkflow 后检查 selectedWorkflowId === workflowId,过期调用不改选中所以不会为未选中的行打开导出,无需额外改动。

测试

新增确定性测试「keeps the last workflow picked when two switches overlap their saves」:拦截草稿 PUT 分两个 gate,先点 B 再点 C;放行 B 的保存后断言选中未变、编辑区仍 inert;放行 C 的保存后断言最终选中 C、inert 解除。

验证:vitest 817 全过、tsc、oxlint、vite build 全绿。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant