Rumah > Artikel > hujung hadapan web > Mengapakah menggunakan setTimeout() dalam rantai janji membawa kepada ralat penghuraian JSON?
Menggunakan setTimeout() dalam Promise Chains
Apabila bekerja dengan janji, adalah penting untuk memahami cara mengendalikan operasi tak segerak dengan betul. Satu isu biasa ialah cubaan menggunakan setTimeout() dalam rantaian janji.
Dalam coretan kod yang disediakan, matlamatnya adalah untuk mengambil satu set pautan dan kemudian mengambil kandungan pautan pertama. Walau bagaimanapun, panggilan setTimeout() digunakan untuk memperkenalkan kelewatan sebelum mengembalikan objek janji seterusnya. Ini membawa kepada ralat penghuraian JSON.
Mengapa ia gagal?
Menggunakan setTimeout() di luar rantai janji menghalang rantai janji daripada diteruskan. Dalam kes ini, panggilan balik setTimeout() mengembalikan janji, tetapi ia tidak dirantai dengan janji sebelumnya. Akibatnya, operasi rantaian seterusnya tidak dilaksanakan.
Penyelesaian
Untuk memastikan rantaian janji utuh, anda mesti mengembalikan janji daripada pengendali .then(). Fungsi setTimeout() hendaklah dibalut dengan janji baharu, memastikan rantai janji dikekalkan.
Contoh
Ganti panggilan setTimeout() dengan kod berikut :
<code class="js">return delay(1000).then(() => { return getLinks(globalObj["two"] + ".txt"); });</code>
Fungsi kelewatan membungkus panggilan setTimeout() dalam janji, membenarkan ia dirantai dengan janji sebelumnya.
Sebagai alternatif, anda boleh melanjutkan objek Promise dengan kelewatan kaedah:
<code class="js">Promise.prototype.delay = function(t) { return this.then(val => { return delay(t, val); }); }</code>
Ini membolehkan anda menggunakan .delay(x) terus pada janji:
<code class="js">getLinks('links.txt') .then((links) => { return getLinks(globalObj["one"] + ".txt"); }) .then((topic) => { return Promise.resolve(topic).delay(1000); }) .then((topic) => { return getLinks(globalObj["two"] + ".txt"); });</code>
Atas ialah kandungan terperinci Mengapakah menggunakan setTimeout() dalam rantai janji membawa kepada ralat penghuraian JSON?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!