#208·waoowaoo

选择形象/场景后界面 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.tsuseSelectProjectCharacterImagelocation-image-mutations.tsuseSelectProjectLocationImage 同样存在):

  1. onMutate 乐观更新写入 queryKeys.projectAssets.all(projectId)['project-assets', projectId]queryKeys.projectData(projectId); 但资产库(AssetLibrary.tsxuseAssets())渲染的是 queryKeys.assets.list(...)['project-assets', projectId, 'unified', folderId, kind]setQueryData 只写精确 key,界面读的缓存从未更新。
  2. onSettled 仅在 variables.confirm 为真时才失效查询,而 useCharacterActions.handleSelectImage / useLocationActions 调用时未传 confirm, 因此既无有效乐观更新也无失效重取。
  3. onMutatecancelQueries({ queryKey: ['project-assets', projectId] }) 为前缀匹配,会连带取消正在进行的 unified 查询。 界面只能等无关事件(窗口聚焦 / 重连 / 其他 mutation)触发刷新。 建议:乐观更新改用 setQueriesData 按前缀写入,或直接写 queryKeys.assets.list 缓存;onSettled 无条件失效资产查询。