diff --git a/README.md b/README.md index 41c8864..dce2138 100644 --- a/README.md +++ b/README.md @@ -48,12 +48,38 @@ doc/ HTTP 与 4106 行情接口文档 `firstPageVisible` 为 `true` 时获取当前 Tab 的 contracts。contracts 返回后先生成占位列表, 再由 `MarketRankingHqRequestClient` 发起行情订阅,行情回调会整体替换 `CardData`。 -```text -aboutToAppear -→ 注册 TCP 重连事件 -→ 获取当前 Tab 的 contracts -→ 填充合约占位列表 -→ 页面可见时订阅行情 +```mermaid +flowchart TD + appear["aboutToAppear"] --> config["读取卡片配置"] + config --> listen["监听 tcpReconnect"] + listen --> visible{"firstPageVisible?"} + visible -- 否 --> idle["等待页面恢复可见"] + visible -- 是 --> fetch["获取当前 Tab 的 contracts"] + fetch --> placeholder["填充合约占位列表"] + placeholder --> stillVisible{"页面仍然可见?"} + stillVisible -- 否 --> idle + stillVisible -- 是 --> subscribe["订阅行情"] + subscribe --> update["行情回调更新 CardData"] + update --> waiting["等待下一次行情推送"] + waiting --> update + + refresh["refreshTrigger 变化"] --> stop["停止旧行情订阅"] + tab["Tab 切换"] --> stop + stop --> clear["清空列表"] + clear --> fetch + + hidden["firstPageVisible = false"] --> stopOnly["停止行情订阅"] + shown["firstPageVisible = true"] --> hasContracts{"已有 contracts?"} + hasContracts -- 是 --> subscribe + hasContracts -- 否 --> fetch + + reconnect["tcpReconnect"] --> reconnectVisible{"页面可见?"} + reconnectVisible -- 否 --> idle + reconnectVisible -- 是 --> reconnectStop["停止旧行情订阅"] + reconnectStop --> hasContracts + + disappear["aboutToDisappear"] --> unlisten["解绑 tcpReconnect"] + unlisten --> stopOnly ``` 运行期间按以下规则更新: @@ -70,6 +96,25 @@ aboutToAppear `aboutToDisappear` 会解绑 TCP 重连监听并停止行情订阅。HTTP 请求等待期间如果页面变为 不可见,contracts 仍可更新,但不会创建行情订阅。 +### 当前异常与恢复处理 + +| 异常或状态 | 处理方式 | +| --- | --- | +| HTTP 获取 contracts 失败 | `updateCardData` 捕获异常并清空列表 | +| TCP 连接恢复 | 收到 `tcpReconnect` 后,仅在页面可见时停止旧行情并重新订阅 | +| TCP 重连时没有 contracts | 重新请求 contracts,请求成功后再订阅行情 | +| TCP 重连时页面不可见 | 忽略重连事件,页面恢复可见后再订阅 | +| 页面变为不可见 | 立即停止行情订阅 | +| 页面恢复可见 | 优先使用已有 contracts 恢复订阅;没有数据时重新请求 | +| 手动刷新 | 停止旧行情、重新请求 contracts,并在可见时重新订阅 | +| Tab 切换 | 停止旧行情、清空旧列表、请求新 Tab 数据并重新订阅 | +| HTTP 返回时页面已隐藏 | 更新 contracts,但不建立行情订阅 | +| 组件消失 | 解绑 TCP 重连监听并停止行情订阅 | + +当前异常处理仍属于基础兜底:尚未实现 HTTP 自动重试、错误提示、请求取消、请求序号校验, +以及行情订阅失败后的延迟重试。快速切换 Tab 时,较早发出的请求仍可能晚于新请求返回; +首次加载使用的延迟任务也尚未在组件消失时取消。 + ## 数据与接口 当前 HTTP Fetcher 仅构造请求参数,行情客户端也尚未连接真实客户端桥接层;页面使用 Mock