服务端阅读 05月29日 22:54
axios 如何实现并发请求和取消请求?代码怎么写?
axios 的并发和取消分别基于 Promise.all 和 AbortController/CancelToken。并发请求: 使用 Promise.all 同时发起多个请求,全部成功返回结果数组,任一失败则整体失败。axios.all 已废弃(v0.27+),直接用 Promise.all。需要逐个处理结果用 Promise.allSettled,无论成功失败都返回每个请求的状态。// 并发请求const [users, posts] = await Promise.all([ axios.get('/api/users'), axios.get('/api/posts')]);// 容错并发const results = await Promise.allSettled([ axios.get('/api/a'), axios.get('/api/b')]);results.forEach(r => { if (r.status === 'fulfilled') handleData(r.value.data);});取消请求: 新方案用 AbortController(v0.22+推荐),旧方案 CancelToken 已废弃。AbortController 是浏览器原生 API,与 fetch 通用。// AbortController 取消const controller = new AbortController();axios.get('/api/data', { signal: controller.signal });// 取消controller.abort();// 封装自动取消:同一接口新请求自动取消旧请求const pending = new Map();function fetchWithCancel(url) { pending.get(url)?.abort(); const ctrl = new AbortController(); pending.set(url, ctrl); return axios.get(url, { signal: ctrl.signal }).finally(() => pending.delete(url));} 追问: Promise.all 和 Promise.allSettled 在错误处理上的区别是什么? 如何控制并发数量(如最多同时 3 个请求)? 取消请求后 axios 抛出的是什么错误?如何区分取消和真正的请求失败? 路由切换时如何批量取消未完成的请求? CancelToken 为什么被废弃?它和 AbortController 的实现原理有什么不同?