Rumah > hujung hadapan web > tutorial js > Mengapakah `setTimeout` Menyebabkan Ralat Parse JSON dalam Rantai Janji?

Mengapakah `setTimeout` Menyebabkan Ralat Parse JSON dalam Rantai Janji?

Susan Sarandon
Lepaskan: 2024-10-30 14:14:02
asal
265 orang telah melayarinya

Why Does `setTimeout` Cause a JSON Parse Error in Promise Chains?

Mengapa setTimeout Menyebabkan Ralat Parse JSON dalam Promise Chains?

Apabila menggunakan rantai janji JavaScript, perangkap biasa cuba menggunakan setTimeout secara salah. Dalam contoh di bawah, fungsi getLinks mengembalikan janji yang mengambil set pautan daripada URL yang disediakan:

<code class="javascript">function getLinks(url) {
  return new Promise((resolve, reject) => {
    // ...XHR logic to fetch links...
  });
}</code>
Salin selepas log masuk

Seterusnya, panggilan getLinks lain mendapatkan semula kandungan pautan pertama:

<code class="javascript">getLinks('links.txt')
  .then((links) => {
    const allLinks = JSON.parse(links);
    return getLinks(allLinks["one"] + ".txt");
  })
  .then((topic) => {
    // ...logic to write topic to body...
    setTimeout(() => {
      return getLinks(allLinks["two"] + ".txt"); // This is where the error occurs
    }, 1000);
  });</code>
Salin selepas log masuk

Walau bagaimanapun, kod ini menyebabkan ralat penghuraian JSON (JSON.parse: aksara tidak dijangka...). Sebabnya terletak pada penggunaan setTimeout yang tidak betul:

Memahami Rantaian Janji

Rantai janji ialah satu siri operasi tak segerak yang dilaksanakan secara berurutan. Setiap operasi (atau kemudian pengendali) mengembalikan janji. Akibatnya, setiap pengendali kemudiannya diluluskan hasil janji sebelumnya.

Peranan setTimeout

Panggil balik setTimeout dilaksanakan secara tak segerak, bukan sebagai sebahagian daripada rantai janji. Mengembalikan nilai daripada panggilan balik setTimeout tidak akan mengembalikan nilai daripada pengendali ketika itu. Sebaliknya, nilai mesti dikembalikan sebelum pengendali kemudian selesai.

Penyelesaian

Untuk menangguhkan pelaksanaan janji berikutnya dalam rantai janji, seseorang perlu mengembalikan janji daripada pengendali ketika itu yang menyelesaikan selepas kelewatan yang diingini:

<code class="javascript">...
.then((topic) => {
  writeToBody(topic);

  // Replace the setTimeout call with a delay promise
  return delay(1000).then(() => {
    return getLinks(allLinks["two"] + ".txt");
  });
});</code>
Salin selepas log masuk

Fungsi kelewatan boleh dilaksanakan seperti berikut:

<code class="javascript">function delay(t, val) {
  return new Promise((resolve) => setTimeout(resolve, t, val));
}</code>
Salin selepas log masuk

Sebagai alternatif, seseorang boleh mentakrifkan kaedah sambungan pada Janji untuk memudahkan sintaks:

<code class="javascript">Promise.prototype.delay = function(t) {
  return this.then((val) => {
    return delay(t, val);
  });
}

...

.then((topic) => {
  writeToBody(topic);
  return delay(1000).delay(500);
});</code>
Salin selepas log masuk

Pendekatan ini memastikan rantaian janji kekal utuh dan operasi seterusnya dilaksanakan seperti yang diharapkan.

Atas ialah kandungan terperinci Mengapakah `setTimeout` Menyebabkan Ralat Parse JSON dalam Rantai Janji?. 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