处理 async/await 并发异常需容错:用 Promise.allSettled 获取全量状态,封装 safeFetch 校验响应体,控制并发数并支持 AbortSignal 取消,按错误类型实施重试或降级。
处理 async/await 中的并发请求异常,关键不是“全成功才继续”或“一错就中断”,而是让系统具备容错能力——能区分失败类型、保留部分结果、可控重试、不泄露未卸载组件的副作用。
Promise.all 一拒即停,丢弃所有 pending 请求的结果;而 allSettled 总会返回每个请求的完整状态(fulfilled 或 rejected),便于逐个分析。
const results = await Promise.allSettled([fetch('/user/1'), fetch('/user/2')]);<br>results.forEach((r, i) => {<br> if (r.status === 'fulfilled') console.log(`第${i+1}个成功`, r.value);<br> else console.warn(`第${i+1}个失败`, r.reason);<br>});
HTTP 状态码非 2xx 不等于 Promise 拒绝,fetch 默认只在网络层出错时 reject,401、500、404 都会 resolve —— 这容易导致后续 .json() 报错或空数据引发崩溃。
async function safeFetch(url) { const res = await fetch(url); if (!res.ok) throw new Error(`${res.status} ${res.statusText}`); return res; }
100 个请求直接丢进 allSettled,可能压垮后端或触发 CDN 限流;用户切换页面时还在跑的请求,也可能造成 setState 报错。
const controller = new AbortController();<br>await fetch(url, { signal: controller.signal });<br>// 卸载时调用 controller.abort()
不是所有失败都要重试:DNS 失败重试无意义,超时可退避重试,404 就该直接放弃。