Axios拦截器返回Promise.reject(error)无法触发请求catch块问题
问题概述
在React Native项目中使用Axios拦截器处理请求错误,期望将处理后的错误传递到请求的catch块用于展示toast,但使用return Promise.reject(error)时,错误始终无法进入初始请求的catch块;改用throw抛出错误则能成功触发catch块。
问题根源
你的响应拦截器错误回调存在一个关键疏漏:调用errorHandler(requestError)后没有返回该函数的执行结果。
Axios要求响应拦截器的错误回调必须返回一个Promise(resolved或rejected状态),才能将后续流程正确传递。当前代码中,错误回调仅执行了errorHandler但未返回结果,相当于默认返回了一个状态为resolved的空Promise,导致请求的catch块无法捕获到错误。
修复代码
只需在拦截器的错误回调中返回errorHandler的执行结果即可:
api.interceptors.response.use( (response) => { return response; }, (requestError) => { // 新增return,将errorHandler返回的rejected Promise传递下去 return errorHandler(requestError); } );
为什么throw能生效
当在errorHandler中使用throw时,相当于在拦截器的执行链中主动抛出了一个异常,Axios会自动将这个异常包装为一个状态为rejected的Promise,因此错误能正常传递到请求的catch块。而使用return Promise.reject()时,由于未将该Promise返回给拦截器,Axios无法感知到这个被拒绝的Promise,自然不会触发后续的catch逻辑。
关于文档的说明
Axios的拦截器文档并未过时,只是你在实现时忽略了**错误回调必须返回处理后的Promise(或抛出错误)**这一核心细节。拦截器的工作逻辑是:只有当错误回调返回一个rejected状态的Promise时,错误才会继续向下传递到请求的catch块;若未返回值,默认会生成resolved状态的Promise,请求会进入then分支而非catch分支。
内容的提问来源于stack exchange,提问作者Luis Vinicius M.

