Axios拦截器里如何统一处理401错误但页面没跳转?
在项目里给Axios加了响应拦截器处理401,发现虽然能捕获到状态码,但跳转登录页的逻辑完全没执行。之前试过用window.location.replace(‘/login’),但页面还是卡在当前页没反应。
代码大概是这样写的:
axios.interceptors.response.use(
response => response,
error => {
if (error.response.status === 401) {
console.log('检测到401'); // 这个确实会打印
window.location.replace('/login'); // 这行好像没执行?
return Promise.reject(error);
}
return Promise.reject(error);
}
);
控制台没报错,但页面就是不跳转,登录页路由明明存在。后来改用router.push(‘/login’)也不行,难道拦截器里不能直接操作路由?
Promise.reject上,它会导致后续的逻辑被中断,页面跳转可能没执行完就被吞掉了。我的建议是用一个标志位缓存起来,确保跳转逻辑只执行一次,然后直接在拦截器里同步完成跳转,别让错误链继续往下传。下面是优化后的代码: