Получить запрос GET, нажав .catch () на что угодно, кроме 200 ответа - PullRequest
0 голосов
/ 11 января 2019

У меня есть резервный магазин с действиями для загрузки учетных записей. Действие вызывает сервис, подобный так:

const requestOptions = {
        method: 'GET',
        headers: authHeader()
    };

    return fetch(`http://localapi.co.uk/api/account/load/${account_id}`, requestOptions)
        .then(handleResponse)
        .then(account => {
            if(account.account.id) {
                localStorage.setItem('account', JSON.stringify(account))
            }

            return account;
        })
        .catch(redirectToLogin)

Обработчик ответа - это просто функция, которая проверяет свойства ответа .status и .ok и отображает ошибку или выходит из системы, если статус ответа 401. Это прекрасно работает для запросов POST. Когда я вхожу в маршрут входа в систему, любой ответ попадает в первый .then (handleResponse) и обрабатывает его.

Когда я отправляю запрос GET вместо 404, 401, 500 и т. Д., Все пропускают .then (handleResponse) и вместо этого переходят к моему улову. Проблема заключается в том, что из-за того, что catch на самом деле не дает мне объект ответа для работы, я не могу проверить состояние - я хочу делать разные вещи в зависимости от того, был ли get 401 (я хочу выйти из системы) или 500 (я хочу отобразить ошибку пользователя с указанием, что пошло не так), например.

Есть ли решение, которое позволит мне получить ответ или остановить мои запросы GET, попав в .catch, и вместо этого попасть в обработчик ответа, который я написал?

Я использую:

  • Базовая часть Laravel 5.7.20

  • a React 16.7.0 front-end

  • работает сервер локального узла с запуском npm

1 Ответ

0 голосов
/ 11 января 2019

Как насчет чистой асинхронной / ожидающей функции. Ожидание готовности данных JSON, а затем получение остальной логики if или возврат объекта учетной записи из функции и перемещение остальной логики в функцию вызывающей стороны. Примерно так:

async myFunc({ account_id}) {
    const url = `http://localapi.co.uk/api/account/load/${account_id}`;
    const response = await fetch(url, { headers: headers: authHeader() });
    const account = await response.json();
    // return account (recommended);
    // Place your if logic here (not recommended because its not clean)
}
...