Rumah > hujung hadapan web > tutorial js > Bagaimana untuk Mensiri Janji dalam JavaScript ES6 For Loop?

Bagaimana untuk Mensiri Janji dalam JavaScript ES6 For Loop?

Linda Hamilton
Lepaskan: 2024-11-27 19:44:19
asal
359 orang telah melayarinya

How to Serialize Promises in a JavaScript ES6 For Loop?

JavaScript ES6 Promise For Loop Serialization

Dalam kod yang diberikan, anda cuba untuk melaksanakan janji secara berurutan dalam gelung for tetapi menghadapi masalah apabila gelung dilaksanakan secara serentak, mengakibatkan tidak dapat diramalkan output.

Memahami Isu:

Janji merangkumi operasi tak segerak, tetapi sifat segerak gelung mencetuskan semua janji serentak, mengabaikan urutan yang diingini.

Memberi janji setTimeout:

Untuk memudahkan pelaksanaan berurutan, kami boleh menjanjikan setTimeout untuk mendapatkan janji yang diselesaikan apabila pemasa tamat tempoh:

const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
Salin selepas log masuk

Pilihan Penyelesaian:

Terdapat pelbagai cara untuk menyelesaikan masalah ini, memanfaatkan janji dan tidak segerak teknik pengaturcaraan.

1. Untuk Gelung dengan Janji Permulaan:

Dengan bermula dengan janji yang diselesaikan serta-merta, anda boleh merangkai janji-janji berikutnya seperti yang diselesaikan oleh janji-janji sebelumnya:

for (let i = 0, p = Promise.resolve(); i < 10; i++) {
  p = p
    .then(() => delay(Math.random() * 1000))
    .then(() => console.log(i));
}
Salin selepas log masuk

2. Array.reduce dengan Initial Promise:

Menggunakan Array.reduce, anda boleh mencipta rangkaian janji yang serupa dengan pendekatan gelung for:

[...Array(10)]
  .reduce(
    (p, _, i) =>
      p.then(() => delay(Math.random() * 1000))
        .then(() => console.log(i)),
    Promise.resolve()
  );
Salin selepas log masuk

3. Berfungsi sebagai Panggilan Balik Resolusi Janji:

Anda boleh mentakrifkan fungsi yang menyalin dirinya sebagai panggilan balik resolusi, membenarkan rantai janji rekursif:

const loop = (i) => {
  delay(Math.random() * 1000)
    .then(() => console.log(i))
    .then(() => {
      if (i < 10) loop(i + 1);
    });
};
loop(0);
Salin selepas log masuk

4. async/wait Syntax (ES2017):

ES2017 memperkenalkan async/wait syntax untuk memudahkan pengendalian kod tak segerak:

const main = async () => {
  for (let i = 0; i < 10; i++) {
    await delay(Math.random() * 1000);
    console.log(i);
  }
};
main();
Salin selepas log masuk

5. untuk menunggu...Sintaks (ES2020):

ES2020 memperkenalkan sintaks khas untuk lelaran ke atas iterables tak segerak:

(async () => {
  for await (const i of [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) {
    await delay(Math.random() * 1000);
    console.log(i);
  }
})();
Salin selepas log masuk

Dengan menggunakan teknik ini, anda boleh melaksanakan janji secara berurutan dalam satu gelung, memastikan susunan operasi yang diingini dan mengelakkan perkara yang tidak dapat diramalkan keluaran.

Atas ialah kandungan terperinci Bagaimana untuk Mensiri Janji dalam JavaScript ES6 For Loop?. 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