Apabila bekerja dengan API fetch(), perbezaan yang ketara dalam tingkah laku timbul apabila menggunakan . json() kaedah. Tingkah laku ini mungkin kelihatan berlawanan dengan intuisi, jadi mari kita selidiki sebab asas.
Secara lalai, .json() mengembalikan janji yang diselesaikan kepada respons JSON yang dihuraikan badan. Ini kerana badan tindak balas mungkin tidak tersedia serta-merta, terutamanya untuk respons besar atau sambungan perlahan. Janji memastikan bahawa kod berikutnya tidak dilaksanakan sehingga JSON dihuraikan sepenuhnya.
Apabila .json() digunakan dalam rantai .then(), ia mengembalikan objek janji itu sendiri, membenarkan rantaian operasi selanjutnya. Walau bagaimanapun, apabila .json() dikembalikan terus daripada pengendali .then(), nilai janji yang telah diselesaikan (JSON yang dihuraikan) dikembalikan sebaliknya. Ini kerana pengendali .then() mengharapkan untuk menerima nilai yang boleh dimanipulasi selanjutnya.
Contoh:
Dalam coretan kod yang disediakan:
fetch(url) .then(response => { return { data: response.json(), status: response.status } }) .then(post => document.write(post.data));
Kaedah .json() dirantai dalam objek literal, jadi ia mengembalikan objek janji, menghasilkan atribut post.data menjadi Janji.
Sintaks Alternatif:
fetch(url) .then(response => response.json()) .then(post => document.write(post.title));
Dalam contoh ini, .json() dikembalikan terus daripada pengendali .then() , jadi nilai JSON yang diselesaikan segera dikembalikan, membenarkan akses terus kepada atribut post.title.
Untuk mengelakkan percanggahan antara literal objek dan nilai pulangan langsung, anda boleh menggunakan sintaks berikut:
fetch(url) .then(response => response.json().then(data => ({ data: data, status: response.status })
Pendekatan ini mengembalikan janji bersarang yang akhirnya diselesaikan kepada objek yang diingini .
Tingkah laku janji .json() bergantung pada cara ia digunakan dalam kod. Apabila merantai operasi, ia mengembalikan objek janji, memastikan penjujukan yang betul. Walau bagaimanapun, apabila mengembalikan .json() terus daripada pengendali .then(), nilai yang diselesaikan (dihuraikan JSON) dikembalikan, membenarkan penggunaan segera. Memahami perbezaan ini adalah penting untuk mengurus janji dan mengelakkan tingkah laku yang tidak dijangka dalam kod anda.
Atas ialah kandungan terperinci Mengapa Kaedah `.json()` Fetch API Mempunyai Gelagat Janji yang Berbeza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!