Rumah  >  Artikel  >  hujung hadapan web  >  Mengapakah menggunakan setTimeout() dalam rantai janji membawa kepada ralat penghuraian JSON?

Mengapakah menggunakan setTimeout() dalam rantai janji membawa kepada ralat penghuraian JSON?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-01 12:53:29607semak imbas

Why does using setTimeout() inside a promise chain lead to a JSON parsing error?

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!

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