Axios配合Promise.allSettled发起请求返回value为undefined问题
问题原因分析
axios 默认会将 HTTP 状态码不在 2xx 区间的请求标记为 rejected 状态,你当前所有请求都返回 fulfilled 状态且 value 为 undefined,本质是 Promise 状态被提前篡改,常见原因有3种:
- 全局或你使用的 axios 实例配置了异常的响应拦截器
如果你配置的响应拦截器错误回调中,没有抛出错误、也没有返回Promise.reject(error),而是直接返回空值,就会出现该问题,错误示例如下:axios.interceptors.response.use( res => res, err => { console.log(err.message) // 这里没有返回 reject 状态的 Promise,直接return会把状态转为 fulfilled,值为 undefined return } ) - 自定义了
validateStatus配置,同时成功拦截器逻辑异常
如果你配置了validateStatus: status => status < 500这类规则,会把 400 判定为合法状态,进入成功响应回调,如果此时成功回调的处理逻辑出错、没有返回响应对象,也会导致 value 为 undefined。 - 生成 promise 数组时额外加了空的 catch 处理
如果你的实际代码是类似以下写法,也会把 rejected 状态转为 fulfilled,值为 undefined:var promises = urls.map(url=> axios.get(url).catch(err => {}));
排查方案
- 先临时注释所有 axios 响应拦截器配置,运行示例代码确认返回结果是否符合预期
- 检查 axios 实例的
validateStatus配置是否被修改 - 确认批量生成 promise 时没有额外的 catch 空处理逻辑
内容的提问来源于stack exchange,提问作者jukow
相关产品推荐
相关产品推荐

