2015-09-22 14 views
21

przypadku żądania z serwera z JavaScript pobrać API, trzeba zrobić coś jakDlaczego obiekt odpowiedzi z interfejsu API pobierania JavaScript jest obietnicą?

fetch(API) 
    .then(response => response.json()) 
    .catch(err => console.log(err)) 

Tutaj, response.json() jest rozwiązanie jego obietnicy.

Chodzi o to, że jeśli chcesz złapać błędy 404, musisz rozwiązać obietnicę odpowiedzi, a następnie odrzucić obietnicę pobrania, ponieważ zakończysz tylko catch, jeśli wystąpi błąd sieci. Tak więc wywołanie pobierania staje się czymś znacznie trudniejszym do odczytania i uzasadnienia. Moje pytanie brzmi: dlaczego jest to potrzebne? Jaki jest sens posiadania obietnicy jako wartości odpowiedzi? Czy istnieją lepsze sposoby radzenia sobie z tym?

+4

Obiekt odpowiedzi nie jest obietnicą. Jest to odpowiedź, z 'json' (i metoda między innymi, która zwraca obietnicę.Jest twoje pytanie, dlaczego' json() 'zwraca obietnicę? –

+1

Niezupełnie duplikat, ale możesz chcieć spojrzeć [tutaj] (http: //stackoverflow.com/a/32516463/3887516) – Amit

+0

Czy naprawdę potrzebujesz treści odpowiedzi 404 jako błędu? Jeśli nie, istnieją prostsze sposoby osiągnięcia tego, co chcesz. Jeśli tak, nie widzę niczego nie tak z tym, jak działa 'fetch'. – Bergi

Odpowiedz

15

Jeśli masz pytanie "dlaczego response.json() zwróci obietnicę?" wtedy @Bergi dostarcza wskazówki w komentarzach: "czeka na załadowanie ciała".

Jeśli pytanie brzmi „dlaczego nie jest response.json atrybut?”, To byłby wymagany fetch opóźnić powrót swoją odpowiedź, aż ciało załadowany, co może być OK dla niektórych, ale nie wszystkich.

Ten polyfill powinien dostać to, co chcesz:

var fetchOk = api => fetch(api) 
    .then(res => res.ok ? res : res.json().then(err => Promise.reject(err))); 

następnie można zrobić:

fetchOk(API) 
    .then(response => response.json()) 
    .catch(err => console.log(err)); 

Odwrotna nie można polyfilled.

Powiązane problemy