前端请求批量请求失败仅弹一次提示的实现方案
在前端开发中,批量异步请求失败时,若每个请求的错误处理都弹出提示,会导致重复提示、干扰用户操作。本文详解3种可靠实现方案,附完整代码与场景建议。
一、问题场景
当同时发起多个请求(如列表数据+用户信息+统计接口)时,若所有请求均失败,每个请求的catch块独立触发提示,会出现短时间内连续弹出多个相同提示的问题。
二、解决方案
1. 全局标志位控制
核心逻辑:用全局变量标记提示是否已弹出,请求失败时先检查标志位,仅在未弹出时执行提示。
实现步骤:
- 声明全局变量(如
isToastShown),初始值为false; - 请求失败时判断标志位:
- 未弹出:执行提示并将标志位设为
true; - 已弹出:跳过提示;
- 未弹出:执行提示并将标志位设为
- (可选)提示关闭后重置标志位,避免后续正常请求失败无法提示。
2. 防抖函数包装
核心逻辑:用防抖函数限制提示在指定时间内仅执行一次,合并短时间内的多次触发。
实现要点:
- 封装提示为防抖函数(如延迟300ms);
- 每个请求的
catch块调用该防抖函数; - 短时间内的多次调用会被合并为一次执行。
3. 集中错误处理(推荐)
核心逻辑:统一管理所有请求的Promise,集中判断是否全部失败后再弹出提示。
实现步骤:
- 将所有请求的Promise存入数组;
- 用
Promise.allSettled()获取所有请求的状态; - 统计失败请求数量,若全部失败则弹出一次提示。
三、代码示例
方案1+3:全局标志位+集中处理
javascript
// 全局标志位:标记Toast是否已弹出
let isToastShown = false;
/**
* 批量请求并统一处理错误
* @param {Array<Promise>} requestList - 请求Promise数组
*/
async function batchRequest(requestList) {
try {
// 等待所有请求完成(无论成功/失败)
const results = await Promise.allSettled(requestList);
// 统计失败请求数
const failedCount = results.filter(res => res.status === 'rejected').length;
// 全部失败且Toast未弹出
if (failedCount === requestList.length && !isToastShown) {
showToast('提示');
isToastShown = true;
// 5秒后重置标志位
setTimeout(() => { isToastShown = false; }, 5000);
}
return results;
} catch (err) {
console.error('批量请求处理异常', err);
}
}
// 示例:发起多个请求
const requests = [
fetch('/api/posts').then(res => res.json()),
fetch('/api/comments').then(res => res.json()),
fetch('/api/stats').then(res => res.json())
];
batchRequest(requests);
方案2:防抖函数包装Toast
javascript
// 自定义防抖函数(或使用lodash.debounce)
function debounce(fn, delay) {
let timer = null;
return (...args) => {
clearTimeout(timer);
timer = setTimeout(() => fn.apply(this, args), delay);
};
}
// 防抖版Toast:300ms内仅执行一次
const showDebouncedToast = debounce((message) => {
showToast(message);
}, 300);
// 单个请求的错误处理
async function fetchData(url) {
try {
const res = await fetch(url);
return res.json();
} catch (err) {
showDebouncedToast('提示');
throw err;
}
}
// 批量发起请求
const requests = [
fetchData('/api/posts'),
fetchData('/api/comments'),
fetchData('/api/stats')
];
四、方案对比与选择
| 方案 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|
| 全局标志位 | 实现简单 | 全局变量易污染 | 小型项目、简单批量请求 |
| 防抖函数 | 自动合并触发 | 无法区分"全部失败"场景 | 高频请求、不确定失败数量 |
| 集中错误处理 | 逻辑清晰、可控性强 | 需要统一管理Promise数组 | 明确批量请求的场景(推荐) |
🎯 2025年最新大厂前端场景面试题(完整题库+解析)
一份系统整理的前端专项面试资料,内容涵盖 JavaScript、React、Vue、Node.js、性能优化、工程化、浏览器原理、网络协议 等高频考点,所有题目均来自大厂真实场景与近期面试趋势。
📚 资料详情
方向:前端开发
格式:PDF
页数:251页(含详细答案与扩展解析)
适用:面试冲刺、体系复盘、技术查漏
📥 获取方式
👉 夸克网盘链接:https://pan.quark.cn/s/bcf695cf5ede
(可直接下载,无需提取码)
希望这份详细的题库能助你高效备战,顺利拿到心仪的 Offer!加油