Pelajaran modul (4/4)
Tantangan: penjadwalan dengan Promises
"Penjadwalan" berarti memutuskan cara menjalankan daftar tugas asinkron: semuanya secara bersamaan, satu per satu,
atau dalam kelompok kecil. Kami akan menggabungkan Promise.all, for await, dan penutupan.
Secara paralel: semuanya bersama-sama
Saat tugas mandiri dan cepat, luncurkan semuanya dan tunggu dengan Promise.all:
async function inParallelo(tasks) {
return Promise.all(tasks.map((t) => t()));
}
const risultati = await inParallelo([
() => Promise.resolve(1),
() => Promise.resolve(2),
() => Promise.resolve(3),
]);
// [1, 2, 3]Total waktu ≈ waktu tugas paling lambat.
Secara seri: satu per satu
Ketika setiap tugas bergantung pada tugas sebelumnya, atau Anda ingin membatasi nilai:
async function inSerie(tasks) {
const risultati = [];
for (const t of tasks) {
risultati.push(await t());
}
return risultati;
}Total waktu ≈ jumlah waktu.
Dengan batas konkurensi
Terkadang Anda tidak menginginkan ribuan permintaan secara bersamaan, tetapi Anda tidak ingin menunggu permintaan tersebut masuk seri: Anda menginginkan maksimum N dalam penerbangan.
async function conLimite(tasks, n) {
const risultati = new Array(tasks.length);
let i = 0;
async function worker() {
while (i < tasks.length) {
const mio = i++;
risultati[mio] = await tasks[mio]();
}
}
await Promise.all(Array.from({ length: n }, worker));
return risultati;
}Idenya: Anda meluncurkan n "pekerja" yang mengambil indeks berikutnya hingga tidak ada yang tersisa.
Cobalah
Definisikan `inSeries(tasks)` async: jika ada array fungsi yang mengembalikan Promises, jalankan fungsi tersebut satu per satu (tunggu) dan kembalikan array hasil dalam urutan eksekusi.
Tunjukkan petunjuk
untuk ... dari dan dorong (tunggu t())
Solusi tersedia setelah 3 upaya
Tinjau latihan
Definisikan async `inParallel(tasks)`: dengan serangkaian fungsi yang mengembalikan Janji, luncurkan semuanya secara paralel dan kembalikan serangkaian hasil dalam urutan yang sama dengan input. Gunakan Promise.all.
Tunjukkan petunjuk
Janji.semua(tugas.peta((t) => t()))
Solusi tersedia setelah 3 upaya