Получить: отклонить обещание и поймать ошибку, если статус не в порядке?

Вот что я собираюсь сделать:

import 'whatwg-fetch';

function fetchVehicle(id) {
    return dispatch => {
        return dispatch({
            type: 'FETCH_VEHICLE',
            payload: fetch(`http://swapi.co/api/vehicles/${id}/`)
                .then(status)
                .then(res => res.json())            
                .catch(error => {
                    throw(error);
                })
            });
    };
}

function status(res) {
    if (!res.ok) {
        return Promise.reject()
    }
    return res;
}

РЕДАКТИРОВАТЬ: обещание не отклоняется, это то, что я пытаюсь выяснить.

Я использую этополучить полифилл в Redux сперевождите-обещание-промежуточный слой.

 Bergi07 июл. 2016 г., 02:17
Этоделает добраться доcatch (который ловит все отклонения во всей цепочке, к которой он присоединен), ноcatch обратный вызов ничего не обрабатывает - он только сбрасывает ошибку. Заменитьthrow сconsole.error или так.
 zerkms07 июл. 2016 г., 02:08
Вы бросаете исключение вcatch но неcatch Это.
 Bergi07 июл. 2016 г., 02:18
Браузер зависает? Это определенно не должно происходить.
 Vlady Veselinov07 июл. 2016 г., 02:52
Спасибо, ребята, я немного новичок в этом, замораживание было вызвано чем-то другим. Я думаю, что это проблема для меня, потому чтоpolyfill рассматривает 404 как успешный ответ. У меня возникли проблемы с отказом от обещания, как только я понял, что все должно быть в порядке.

Ответы на вопрос(3)

отказавшись от обещания в.catch() решил мою проблему:

export function fetchVehicle(id) {
    return dispatch => {
        return dispatch({
            type: 'FETCH_VEHICLE',
            payload: fetch(`http://swapi.co/api/vehicles/${id}/`)
                .then(status)
                .then(res => res.json())    
                .catch(error => {
                    return Promise.reject()
                })
            });
    };
}


function status(res) {
    if (!res.ok) {
        throw new Error(res.statusText);
    }
    return res;
}
 gugol14 мар. 2019 г., 16:07
Или на самом деле вы можете отклонить обещание с сообщением, полученным от вашей конечной точки, если вы jsonfy этот ответ, а затем вернуть обещание, отклоненное со свойствами, выбранными вами из вашего ответа jsonfied.
 gugol14 мар. 2019 г., 16:00
Вы также можете отклонить Обещание от функции статуса следующим образом:function status(res) { if (!res.ok) { return Promise.reject(res.statusText); } return res; }  Или на самом деле вы можете отклонить обещание с помощью сообщения, полученного от вашей конечной точки.

$promise.then( function successCallback(response) {

  console.log(response);

  if( response.status === 200 ) { ... }

});
Решение Вопроса

получать Обещания отклоняются только с TypeError, когда происходит ошибка сети. Поскольку ответы 4xx и 5xx не являются сетевыми ошибками, нечего ловить. Вам нужно будет выдать ошибку самостоятельно, чтобы использоватьPromise#catch.

A получить ответ удобно поставляетok , который сообщает вам, успешно ли выполнен запрос. Нечто подобное должно сработать:

fetch(url).then((response) => {
  if (response.ok) {
    return response.json();
  } else {
    throw new Error('Something went wrong');
  }
})
.then((responseJson) => {
  // Do something with the response
})
.catch((error) => {
  console.log(error)
});
 Torsten Barthel14 мар. 2018 г., 04:55
Я не нашел свойства 'ok', а проверил на response.status === 200.
 Shiva Sai19 апр. 2018 г., 09:41
это решение прекратит получать ошибки в консоли, такие как 401 неправильный запрос?
 Michael03 апр. 2018 г., 21:05
Почему я не могу сказать из своего кода, почему была брошена ошибка TypeError? В консоли я вижу, что в одном случае это было "net :: ERR_CONNECTION_TIMED_OUT", но в другом это было "(заблокировано: смешанное содержимое)", и я не хочу отвечать одинаково на оба.
 tonix11 июл. 2018 г., 23:29
Как мы можем возвращать пользовательские ответы, когда нет сетевого подключения или когда сервер ответил, например,503 Service Temp. Unavailable если результатом отклоненного обещания являетсяTypeError?

Ваш ответ на вопрос