Saya telah bermain-main dengan fetch()
api baru-baru ini, dan melihat sesuatu yang agak aneh.
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
mengembalikan sebuah Promise
objek.
http://jsbin.com/wofulo/2/edit?js,output
Namun jika ditulis sebagai:
let url = "http://jsonplaceholder.typicode.com/posts/6";
let iterator = fetch(url);
iterator
.then(response => response.json())
.then(post => document.write(post.title));
;
post
berikut adalah standar Object
yang dapat Anda akses atribut judul.
http://jsbin.com/wofulo/edit?js,output
Jadi pertanyaan saya adalah: mengapa response.json
mengembalikan janji dalam objek literal, tetapi mengembalikan nilainya jika baru saja dikembalikan?
javascript
asynchronous
promise
fetch-api
hasacigaro
sumber
sumber
response.json()
janji mungkin ditolak jika respons JSON tidak valid.Jawaban:
Karena Anda menerima
response
segera setelah semua header telah tiba. Menelepon.json()
memberi Anda janji lain untuk isi respons http yang belum dimuat. Lihat juga Mengapa objek respons dari JavaScript fetch API sebuah janji? .Karena begitulah cara kerja janji . Kemampuan untuk mengembalikan promise dari callback dan membuatnya diadopsi adalah fitur mereka yang paling relevan, yang membuatnya dapat dirantai tanpa bersarang.
Kamu bisa memakai
atau pendekatan lain apa pun untuk mengakses hasil promise sebelumnya dalam rantai .then () untuk mendapatkan status respons setelah menunggu badan json.
sumber
JSON.parse()
daripadares.json()
??res.json()
pada dasarnya adalah jalan pintas untukres.text().then(JSON.parse)
. Keduanya menunggu data menggunakan promise dan mengurai json.Perbedaan ini disebabkan oleh perilaku Janji lebih dari
fetch()
secara spesifik.Saat
.then()
callback mengembalikan tambahanPromise
,.then()
callback berikutnya dalam rantai pada dasarnya terikat ke Promise itu, menerima penyelesaian atau penolakan pemenuhan dan nilainya.Cuplikan ke-2 juga dapat ditulis sebagai:
Baik dalam bentuk ini maupun milik Anda, nilai
post
diberikan oleh Janji yang dikembalikan dariresponse.json()
.Namun, ketika Anda mengembalikan sebuah dataran
Object
,.then()
menganggap itu sebagai hasil yang sukses dan segera terselesaikan dengan sendirinya, mirip dengan:post
dalam hal ini hanyaObject
Anda yang dibuat, yang memegang aPromise
didata
propertinya. Penantian janji itu untuk dipenuhi masih belum lengkap.sumber
Selain itu, yang membantu saya memahami skenario khusus yang Anda jelaskan ini adalah dokumentasi Promise API , yang secara khusus menjelaskan bagaimana janji yang dikembalikan oleh
then
metode akan diselesaikan secara berbeda bergantung pada apa yang dikembalikan oleh penangan :sumber
Selain jawaban di atas, berikut adalah bagaimana Anda dapat menangani respons seri 500 dari api Anda di mana Anda menerima pesan kesalahan yang dikodekan dalam json:
sumber