用户行为是重试策略的关键刹车信号——需依页面可见性、路由切换、主动交互及操作语义动态中止:监听visibilityState、路由守卫、abortKey管理、分类处理读/写请求,并用isUserActive等轻量状态协同控制。

用户行为是决定重试是否继续的关键信号——不是所有失败都该默默重试,而要根据用户当前状态动态调整策略。比如用户已离开页面、点击了其他按钮、或手动取消操作,此时继续重试不仅无效,还可能干扰后续逻辑、浪费资源。
检测页面可见性与路由切换
当用户切到后台(如按 Home 键、切换 App、最小化浏览器标签),多数移动端系统会限制网络请求或暂停 JS 执行。继续重试大概率失败或被丢弃:
- 监听 document.visibilityState,若变为
hidden,立即中止所有待重试任务 - 在 Vue/React 中,利用 onBeforeUnmount 或 useEffect cleanup 清理未完成的重试定时器和 AbortController
- 配合路由库(如 Vue Router 的
beforeRouteLeave),在跳转前调用controller.abort()
响应用户主动交互
用户连点、快速滑动、重复提交等行为,意味着原始请求可能还在进行中,新操作已覆盖旧意图:
- 按钮点击后禁用,并绑定唯一 abortKey,下次点击生成新 controller,自动废弃前一次重试链
- 对搜索、筛选类请求,用户输入新关键词时,应取消上一轮所有重试(包括 pending 的 setTimeout 和 fetch)
- 若用户手动点击“重试”按钮,不再走静默重试逻辑,而是以全新上下文发起(重置 retryCount、使用新 signal)
结合操作语义判断重试合理性
不是所有请求都适合在用户行为变化后继续重试,需按业务动作分类处理:
立即学习“Java免费学习笔记(深入)”;
- 读操作(GET):用户刷新页面、下拉刷新时,可清空旧重试,重新开始;用户停留在同一屏超 10 秒无操作,可终止静默重试
- 写操作(POST/PUT):若用户已跳转到订单成功页,即使原支付请求还在重试,也应立刻中止——避免重复扣款或创建冗余资源
- 非关键请求(头像加载、埋点上报):用户关闭页面即放弃,不记录错误,也不触发告警
用轻量状态标记用户意图
不依赖复杂状态机,仅用几个布尔值就能有效协同:
- 维护 isUserActive(基于鼠标移动、触摸、键盘事件节流判断):若连续 5 秒无活动,暂停非紧急重试
- 设置 isIntentCleared(如表单提交后设为 true):一旦为 true,任何残留重试都拒绝执行
- 在请求配置中传入 abortOnUserAction: true,由封装函数统一处理中止逻辑
重试不是后台黑盒,它必须听懂用户正在做什么。把用户行为当作重试系统的“刹车信号”,比单纯计数或延时更贴近真实体验。


















