# 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
   <view class="state-error" wx:if="{{pageState === 'error'}}">
     <text class="error-text">加载失败，请重试</text>
     <view class="retry-btn" bindtap="onRetry">重试</view>
   </view>
   ```
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` 缓存上次成功的列表数据）
