שיעורי מודול (4/4)
אתגר: תזמון עם הבטחות
"תזמון" פירושו החלטה כיצד להפעיל רשימה של משימות אסינכרון: כולם ביחד, אחד בכל פעם,
או בקבוצות קטנות. נשלב בין Promise.all, for await וסגירות.
במקביל: כולם ביחד
כאשר המשימות עצמאיות ומהירות, הפעל את כולן והמתן עם 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]זמן כולל ≈ זמן של המשימה האיטי ביותר.
בסדרה: אחד בכל פעם
כאשר כל משימה תלויה בקודמתה, או שאתה רוצה להגביל את השיעור:
async function inSerie(tasks) {
const risultati = [];
for (const t of tasks) {
risultati.push(await t());
}
return risultati;
}זמן כולל ≈ סכום של הזמנים.
עם מגבלת מקבילות
לפעמים אתה לא רוצה אלף בקשות במקביל, אבל אתה לא רוצה לחכות להן סדרה או: אתה רוצה מקסימום N בטיסה.
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;
}הרעיון: אתה משיק n "עובדים" שתופסים את האינדקס הבא עד שלא נשאר כלום.
נסה את זה
הגדר 'inSeries(tasks)' אסינכרון: בהינתן מערך של פונקציות המחזירות הבטחות, הפעל אותן אחת אחת (חכה) והחזר את מערך התוצאות בסדר ביצוע.
הצג רמז
עבור ... של ודחף(ממתין t())
הפתרון זמין לאחר 3 ניסיונות
סקירת התרגיל
הגדר 'inParallel(tasks)' אסינכרון: בהינתן מערך של פונקציות המחזירות הבטחות, הפעל את כולן במקביל והחזר מערך תוצאות באותו סדר כמו הקלט. השתמש ב-Promise.all.
הצג רמז
Promise.all(tasks.map((t) => t()))
הפתרון זמין לאחר 3 ניסיונות