2016-07-07 3 views
4

Вот что я собираюсь:Fetch: отклонить обещание и уловить ошибку, если статус не в порядке?

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

EDIT: Обещание не получают отказ, это то, что я пытаюсь выяснить.

Я использую этот fetch polyfill в Редксе с redux-promise-middleware.

+0

Вы бросаете исключение в 'catch', но не' catch' Это. – zerkms

+0

Он * делает * попадает в 'catch' (который улавливает все отклонения во всей цепочке, к которой он привязан), но обратный вызов' catch' ничего не обрабатывает - он только заново вызывает ошибку. Замените 'throw' на' console.error' или так. – Bergi

+0

Браузер замораживает? Это определенно не должно произойти. – Bergi

ответ

4

Спасибо за помощь всем, отвергая обещание в .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; 
} 
14

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

A fetch Response удобно поставляет 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) 
});