Axio перехватчики: как выкинуть ошибки в onFulfill? - PullRequest
1 голос
/ 07 июня 2019

Я знаю, что axios interceptors может справиться с ботом нормально и ко

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 Ответ

1 голос
/ 08 июня 2019

Вы можете написать довольно простой патч для 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, тогда предполагаемый this необходимо будет указать с помощью Function .prototype .call () :

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
    )
};
...