# P6→NS1/RNS1 缺失项 #14:网络异常时的离线提示和重试机制 ## 简要结论 - 状态:⚠️ 部分解决 - 风险等级:🟠 中 - request.ts 有基础的错误抛出和 401 自动刷新机制,页面级有错误状态和重试按钮,但缺少统一的网络异常拦截、离线检测提示和全局重试机制。 ## 详细审查 ### 审查范围 - `apps/miniprogram/miniprogram/utils/request.ts` - `apps/miniprogram/miniprogram/pages/task-list/task-list.wxml` - `apps/miniprogram/miniprogram/pages/task-list/task-list.ts` - `apps/miniprogram/miniprogram/pages/task-detail/task-detail.wxml` - `apps/miniprogram/miniprogram/pages/task-detail/task-detail.ts` ### 发现 #### 已实现的部分 1. `request.ts` 中 `wxRequest` 的 `fail` 回调会 reject 错误(`statusCode: 0`),但未做网络类型判断 2. `request.ts` 实现了 401 自动刷新 token + 排队重试机制 3. task-list.wxml 有错误状态 UI + 重试按钮: ```xml 加载失败,请重试 重试 ``` 4. task-detail.wxml 同样有错误状态 + 重试按钮 #### 缺失的部分 1. `request.ts` 中无 `wx.getNetworkType()` 离线检测 2. 无全局网络状态监听(`wx.onNetworkStatusChange`) 3. 无统一的网络异常 toast 提示(如"网络连接失败,请检查网络") 4. 无请求超时配置(wx.request 默认 60s) 5. 无自动重试机制(非 401 场景的网络错误不会自动重试) 6. 无离线缓存策略(断网时无法展示上次加载的数据) ### 证据 request.ts 中 fail 回调仅简单 reject: ```typescript fail(err) { reject({ statusCode: 0, data: err }) }, ``` 无网络类型判断、无离线提示、无重试逻辑。 task-list.ts 中 loadData 的 catch 仅设置错误状态: ```typescript } catch { this.setData({ pageState: 'error' }) } ``` 无区分网络错误和服务端错误。 ### 建议 1. `request.ts` 增强: - 请求前调用 `wx.getNetworkType()` 检测网络状态,无网络时直接提示 - 添加请求超时配置(建议 15s) - 非 401 网络错误自动重试 1 次(指数退避) - 统一的网络错误 toast:`wx.showToast({ title: '网络连接失败', icon: 'none' })` 2. `app.ts` 中注册 `wx.onNetworkStatusChange` 全局监听,断网时显示顶部提示条 3. 页面级错误状态区分"网络错误"和"服务端错误",显示不同的提示文案 4. 可选:添加离线缓存(`wx.setStorageSync` 缓存上次成功的列表数据)