Axio拦截器:如何在onFulfill中引发错误?

时间:2019-06-07 08:10:44

标签: promise axios interceptor

我知道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处理程序未捕获我的拒绝。

1 个答案:

答案 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
    )
};