如何使用lodash的_.debounce防抖axios拦截器解决加载动画频闪问题
解决方案
核心逻辑是:立即触发「网络繁忙」状态的设置,仅对「网络空闲」状态的切换做防抖延迟,避免短时间内多个请求往返时状态频繁来回切换。
实现步骤
- 引入lodash的
debounce方法,创建防抖的空闲状态设置函数,延迟时长可根据业务场景调整(推荐200~500ms) - 请求拦截器中每次发起请求时,先清空待执行的空闲状态设置任务,再立即将状态设为繁忙
- 响应/错误拦截器中统一调用防抖函数触发空闲状态设置
修改后代码
import debounce from 'lodash/debounce' const instance = axios.create({ baseURL: environment.CUSTOM_BASE_URL, }); // 创建防抖的空闲状态设置函数,延迟300ms执行 const debouncedSetNetworkIdle = debounce(() => { store.commit("setNetworkBusyStatus", false); }, 300) instance.interceptors.request.use((config) => { // 发起新请求时,先取消之前待执行的空闲状态切换任务 debouncedSetNetworkIdle.cancel() store.commit("setNetworkBusyStatus", true); return config; }); instance.interceptors.response.use( (response) => { // 调用防抖函数延迟设置空闲状态 debouncedSetNetworkIdle() return response; }, (error) => { // 请求报错同样要触发空闲状态设置 debouncedSetNetworkIdle() if ([401, 403].includes(error.response.status)) { store.commit("delUserData"); router.push("/login"); } return Promise.reject(error); }, );
可调优项
- 可根据业务需求调整防抖延迟时长:时长过短仍可能出现频闪,过长会导致加载动画消失太慢影响感知
- 若存在不需要计入网络繁忙状态的请求(如后台静默轮询),可在请求config中新增自定义标识,请求拦截器中判断到该标识时跳过状态修改逻辑即可
内容的提问来源于stack exchange,提问作者Kirk Ross
相关产品推荐
相关产品推荐

