Rumah >hujung hadapan web >tutorial js >Mengapakah `fetch().then().json()` Kadangkala Memulangkan Janji dan Kadangkala Tidak?

Mengapakah `fetch().then().json()` Kadangkala Memulangkan Janji dan Kadangkala Tidak?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-11 14:19:11452semak imbas

Why Does `fetch().then().json()` Sometimes Return a Promise and Sometimes Not?

Mengapa .json() Memulangkan Janji, tetapi Tidak Apabila Ia Melewati .then()?

Soalan:
Semasa menggunakan API Ambil, diperhatikan bahawa kaedah .json() mengembalikan Objek janji apabila digunakan dalam objek literal dalam pengendali .then(). Walau bagaimanapun, apabila digunakan tanpa literal objek, ia mengembalikan nilai secara langsung.

Jawapan:

Mengenai Janji:

.json() mengembalikan Promise kerana respons HTTP diterima apabila pengepala tersedia, tetapi badan (dalam kes ini, JSON) tidak belum dimuatkan. .json() mendapatkan semula janji kedua untuk badan, yang mesti dimuatkan secara berasingan.

Mengenai .then() Kelakuan:

Apabila Janji dikembalikan daripada a .then() panggil balik, ia diterima pakai oleh rantaian luar. Ini bermakna bahawa .then() luar akan menerima nilai Janji dalaman yang dipenuhi. Dalam contoh yang diberikan, outer .then() menerima objek dengan data dan sifat status, dengan berkesan menjadikan sifat data tersedia terus dalam .then().

Penyelesaian Alternatif:

Untuk mengakses kedua-dua status dan data JSON secara langsung dalam satu pengendali .then(), anda boleh menggunakan yang berikut teknik:

  • Gunakan blok .then() bersarang:
fetch(url)
  .then(response => response.json())
  .then(data => {
    console.log(response.status, data.title);
  });
  • Gunakan async/wait (memerlukan fungsi async):
const response = await fetch(url);
const data = await response.json();
console.log(response.status, data.title);

Ingat untuk mengesahkan status respons sebelum membaca kandungan, kerana ia mungkin tidak selalu mengandungi JSON data.

Atas ialah kandungan terperinci Mengapakah `fetch().then().json()` Kadangkala Memulangkan Janji dan Kadangkala Tidak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn