选择形象/场景后界面 80~150 秒不更新(乐观更新写错 query key + 缺失效重取)
Author: shao-zhaoCreated Aug 13, 2026Updated Aug 13, 2026
现象:资产库点击「选择此方案」,接口 432ms 成功返回,界面却要 80~150 秒 才切换。期间无慢请求,服务端也收不到额外请求。 实测时间线(生产环境,切换角色形象方案1→方案2):
| 时刻 | 事件 |
|---|---|
| 4.0s | POST /api/assets/<id>/select-render → 200,耗时 432ms |
| 4.4s~87.7s | 83 秒无任何刷新请求,仅 /api/runs 轮询 |
| 87.8s | 重新拉取 /api/assets 等 |
| 88.3s | 界面更新为「已选择方案2」 |
原因(src/lib/query/mutations/character-base-mutations.ts
的 useSelectProjectCharacterImage,location-image-mutations.ts
的 useSelectProjectLocationImage 同样存在):
onMutate乐观更新写入queryKeys.projectAssets.all(projectId)→['project-assets', projectId]与queryKeys.projectData(projectId); 但资产库(AssetLibrary.tsx→useAssets())渲染的是queryKeys.assets.list(...)→['project-assets', projectId, 'unified', folderId, kind]。setQueryData只写精确 key,界面读的缓存从未更新。onSettled仅在variables.confirm为真时才失效查询,而useCharacterActions.handleSelectImage/useLocationActions调用时未传confirm, 因此既无有效乐观更新也无失效重取。onMutate中cancelQueries({ queryKey: ['project-assets', projectId] })为前缀匹配,会连带取消正在进行的 unified 查询。 界面只能等无关事件(窗口聚焦 / 重连 / 其他 mutation)触发刷新。 建议:乐观更新改用setQueriesData按前缀写入,或直接写queryKeys.assets.list缓存;onSettled无条件失效资产查询。
Source: waooAI/waoowaoo