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

Mary-Kate Olsen
Lepaskan: 2024-11-01 12:53:29
asal
606 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!