我知道axios拦截器可以处理bot ok和ko
axios.interceptors.response.use(
// onFullfilled
function(axios_response) {
return axios_response;
},
// onRejected
function(axios_error) {
console.log(axios_error);
return Promise.reject(axios_error);
}
)
我确切的问题是:我如何在onRejected
内抛出错误,以便能够在同级onRejected
中处理错误?
我尝试过
// onFullfilled
function(axios_response) {
if (!axios_response.data) return axios_response;
const { data } = axios_response;
if (!data.status || !data.message) return axios_response;
const { status, message } = data;
console.log("status", status);
console.log("message", message);
if (status === "error") {
return Promise.reject(axios_response);
}
return axios_response;
},
但这是错误的方式,因为拦截器的onRejected
处理程序未捕获我的拒绝。
答案 0 :(得分:1)
您可以为axios.interceptors.response.use()
写一个相当简单的补丁,例如axios.interceptors.response.use_()
。
在axios初始化后,将以下内容放置在适当的位置:
axios.interceptors.response.use_ = function(onFullfilled, onRejected) {
axios.interceptors.response.use(
// onFullfilled
function(response) {
try {
return onFullfilled(response);
}
catch(e) {
return onRejected(e);
}
},
// onRejected
onRejected,
)
};
该修补程序实现与原始.use()
相同的接口。在使用.use_()
而不是.use()
建立了拦截之后,如果您的onFullfilled()
抛出(故意或其他方式),则将调用相同的onRejected
处理程序,就好像拦截了拦截一样
那还是它的本质。
如果有一个处理程序可能会使用关键字this
,则需要使用Function.prototype.call()
指定预期的this
:
axios.interceptors.response.use_ = function(onFullfilled, onRejected) {
axios.interceptors.response.use(
// onFullfilled
function(response) {
try {
return onFullfilled.call(this, response);
}
catch(e) {
return onRejected.call(this, e);
}
},
// onRejected
onRejected
)
};