在worklist页面,偶尔会出现"正在同步RIS数据"的toast消息一直显示,不消失的问题,严重影响用户体验。
src/hooks/useRisAutoSync.ts 中的 onSyncStart 回调message.loading('正在同步RIS数据...', 0) - 第二个参数 0 表示不自动消失src/hooks/useRisAutoSync.ts 中的 onSyncComplete 回调messageDestroyRef.current() 关闭loading消息src/API/interceptor.ts 中的 axios 实例没有设置 timeout,导致请求可能无限等待/auth/study/ris API 请求卡住,await syncRis(params) 永远不会完成onSyncComplete 回调sequenceDiagram
participant Hook as useRisAutoSync
participant Service as RisSyncService
participant API as syncRis
participant Toast
Hook->>Service: start()
Service->>API: syncRis() - 卡住
Note over API: 请求无限等待
Service->>Service: 等待响应(永远)
Note over Toast: Toast永远显示
打开浏览器开发者工具
F12 或右键选择"检查元素"Network 标签页设置网络限速
No throttling 下拉菜单Offline 或自定义慢速网络:
Name: Very Slow 3G,Download: 50kb/s,Upload: 50kb/s,Latency: 2000ms进入worklist页面
观察现象
// src/API/interceptor.ts 中临时添加
const axiosInstance = axios.create({
baseURL: API_BASE_URL,
timeout: 24 * 60 * 60 * 1000, // 24小时超时(实际上无限等待)
// ... 其他配置
});
/auth/study/ris 请求上设置断点如果可以访问后端服务器:
修改后端代码
/auth/study/ris 接口故意不返回响应重启服务器并测试
要确认问题确实复现,可以:
检查浏览器Network标签
/auth/study/ris 请求处于 pending 状态检查控制台日志
[RisSyncService] 同步成功 或 [RisSyncService] 同步失败 日志await syncRis(params) 这一行检查UI状态
为 axios 实例添加超时设置,防止请求无限等待。
修改文件:src/API/interceptor.ts
const axiosInstance = axios.create({
baseURL: API_BASE_URL,
timeout: 30000, // 30秒超时
// ... 其他配置
});
优点:
缺点:
在同步服务中添加超时控制,确保即使请求卡住也能触发错误处理。
允许用户手动取消正在进行的同步操作。
修复后,可以通过以下方式验证:
src/hooks/useRisAutoSync.ts - 自动同步Hooksrc/services/risSync/RisSyncService.ts - 同步服务src/API/interceptor.ts - axios配置(已修改)src/API/patient/risActions.ts - RIS API接口文档版本:1.0.0 创建日期:2025-11-07 作者:系统维护者