fetch()
Ostatnio bawiłem się z interfejsem API i zauważyłem coś, co było nieco dziwaczne.
let url = "http://jsonplaceholder.typicode.com/posts/6";
let iterator = fetch(url);
iterator
.then(response => {
return {
data: response.json(),
status: response.status
}
})
.then(post => document.write(post.data));
;
post.data
zwraca Promise
obiekt.
http://jsbin.com/wofulo/2/edit?js,output
Jednak jeśli jest napisane jako:
let url = "http://jsonplaceholder.typicode.com/posts/6";
let iterator = fetch(url);
iterator
.then(response => response.json())
.then(post => document.write(post.title));
;
post
tutaj jest standard, do Object
którego można uzyskać dostęp do atrybutu tytułu.
http://jsbin.com/wofulo/edit?js,output
Moje pytanie brzmi: dlaczego response.json
zwraca obietnicę w literale obiektu, ale zwraca wartość, jeśli została zwrócona?
javascript
asynchronous
promise
fetch-api
haveacigaro
źródło
źródło
response.json()
obietnica może zostać odrzucona, jeśli odpowiedź nie jest poprawnym formatem JSON.Odpowiedzi:
Ponieważ otrzymujesz,
response
gdy tylko nadejdą wszystkie nagłówki. Wywołanie.json()
daje kolejną obietnicę dotyczącą treści odpowiedzi http, która nie została jeszcze załadowana. Zobacz także Dlaczego obiekt odpowiedzi z JavaScript Fetch API jest obietnicą? .Ponieważ tak działają obietnice . Możliwość zwracania obietnic z wywołania zwrotnego i przyjmowania ich jest ich najważniejszą funkcją, dzięki czemu można je łączyć w łańcuchy bez zagnieżdżania.
Możesz użyć
lub jakakolwiek inna metoda dostępu do poprzedniej obietnicy skutkuje utworzeniem łańcucha .then (), aby uzyskać status odpowiedzi po oczekiwaniu na treść json.
źródło
JSON.parse()
zamiastres.json()
??res.json()
to w zasadzie skrót dores.text().then(JSON.parse)
. Obie czekają na dane przy użyciu obietnicy i analizują plik json.Ta różnica wynika bardziej niż
fetch()
konkretnie z zachowania Obietnic .Kiedy
.then()
callback zwraca dodatkowyPromise
, następny.then()
callback w łańcuchu jest zasadniczo powiązany z tą obietnicą, otrzymując rozwiązanie lub odrzucenie spełnienia i wartości.Drugi fragment można również zapisać jako:
Zarówno w tej formie, jak i w Twojej, wartość
post
określa przyrzeczenie zwrócone zresponse.json()
.Kiedy jednak zwracasz zwykły
Object
,.then()
uważa, że wynik jest pomyślny i rozwiązuje się natychmiast, podobnie do:post
w tym przypadku jest po prostu tym,Object
co stworzyłeś, który posiadaPromise
w swojejdata
własności. Oczekiwanie na wypełnienie się tej obietnicy jest wciąż niepełne.źródło
Ponadto, to, co pomogło mi zrozumieć ten konkretny scenariusz, który opisałeś, to dokumentacja Promise API , w szczególności gdzie wyjaśnia, w jaki sposób obietnica zwrócona przez
then
metodę zostanie rozwiązana w różny sposób w zależności od tego, co zwraca program obsługi fn :źródło
Oprócz powyższych odpowiedzi, oto, w jaki sposób możesz obsłużyć odpowiedź serii 500 z interfejsu API, w której pojawia się komunikat o błędzie zakodowany w formacie json:
źródło