应注册监听网络状态变化、设计轻量级离线提示、封装带重试逻辑的请求函数,并提供用户可控的重试入口与状态反馈。

注册并监听网络状态变化
在主应用入口(如 main.js 或组件挂载时)检测当前连接状态,并监听 online 和 offline 事件。这不是轮询,而是浏览器原生事件,响应及时且低开销:
- 用
navigator.onLine获取初始状态,避免首次加载误判 - 绑定全局事件监听器,统一管理状态变更逻辑
- 避免重复绑定,可在初始化时检查是否已存在监听器
示例代码:
let isCurrentlyOnline = navigator.onLine;
function handleOnline() {
isCurrentlyOnline = true;
showSuccessToast('已重新连接网络');
triggerPendingSync(); // 后续触发待同步操作
}
function handleOffline() {
isCurrentlyOnline = false;
showOfflineBanner('网络已断开,部分功能受限');
}
window.addEventListener('online', handleOnline);
window.addEventListener('offline', handleOffline);
设计轻量级离线提示与交互引导
用户需要明确知道“正在离线”以及“该做什么”,而不是仅看到错误或空白。提示应可关闭、不打断核心流程,并提供主动重试入口:
- 顶部固定 banner 或底部浮动提示条,含「重试」按钮,点击后手动触发一次 fetch 或 sync
- 按钮文案具体化,如「重试加载」、「同步未发送内容」,而非笼统的「重试」
- 对关键操作(如提交表单),禁用按钮并显示「离线中,稍后自动同步」状态
- 避免弹窗打断用户,尤其在移动端
封装带重试逻辑的请求函数
所有 API 调用应走统一请求层(如自定义 apiClient),内部集成离线兜底和重试策略:
- 请求失败且
!navigator.onLine时,自动存入 IndexedDB 待同步队列,标记时间戳和原始参数 - 在线后自动遍历队列执行(通过
online事件触发),成功则删除;失败则记录错误并保留重试机会 - 支持手动重试:暴露
retryPendingRequests()方法供按钮调用 - 限制重试次数(如最多 3 次),防止无限循环
例如:
async function safeFetch(url, options = {}) {
try {
const res = await fetch(url, options);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res;
} catch (err) {
if (!navigator.onLine) {
await saveToSyncQueue({ url, options, timestamp: Date.now() });
showOfflineHint('请求已暂存,恢复网络后将自动同步');
return null;
}
throw err;
}
}
提供用户可控的重试入口与状态反馈
把“重试”从技术行为转化为用户可理解、可操作的动作:
- 在离线 banner 中放置「立即重试」按钮,点击后调用封装好的重试函数,并显示加载态
- 为每类待同步任务(如草稿保存、评论提交)提供独立重试按钮,附带简要说明(如「重发您的留言」)
- 同步完成后显示微提示(如「✅ 已同步 2 条数据」),增强确定感
- 若多次重试失败,提示「请检查网络设置或稍后再试」,并给出跳转系统 Wi-Fi 设置的链接(Android/iOS 可用
intent://或App-Prefs:协议)


















