דילוג לתוכן המרכזי
מודול 8 · שיעור 4 מתוך 432/32 בקורס~15 min
שיעורי מודול (4/4)

אתגר: תזמון עם הבטחות

"תזמון" פירושו החלטה כיצד להפעיל רשימה של משימות אסינכרון: כולם ביחד, אחד בכל פעם, או בקבוצות קטנות. נשלב בין Promise.all, for await וסגירות.

במקביל: כולם ביחד

כאשר המשימות עצמאיות ומהירות, הפעל את כולן והמתן עם Promise.all:

JS
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]

זמן כולל ≈ זמן של המשימה האיטי ביותר.

בסדרה: אחד בכל פעם

כאשר כל משימה תלויה בקודמתה, או שאתה רוצה להגביל את השיעור:

JS
async function inSerie(tasks) {
  const risultati = [];
  for (const t of tasks) {
    risultati.push(await t());
  }
  return risultati;
}

זמן כולל ≈ סכום של הזמנים.

עם מגבלת מקבילות

לפעמים אתה לא רוצה אלף בקשות במקביל, אבל אתה לא רוצה לחכות להן סדרה או: אתה רוצה מקסימום N בטיסה.

JS
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 "עובדים" שתופסים את האינדקס הבא עד שלא נשאר כלום.

נסה את זה

פעילות גופנית#js.m8.l4.e1
ניסיונות: 0טוען...

הגדר 'inSeries(tasks)' אסינכרון: בהינתן מערך של פונקציות המחזירות הבטחות, הפעל אותן אחת אחת (חכה) והחזר את מערך התוצאות בסדר ביצוע.

טוען עורך...
הצג רמז

עבור ... של ודחף(ממתין t())

הפתרון זמין לאחר 3 ניסיונות

סקירת התרגיל

פעילות גופנית#js.m8.l4.e2
ניסיונות: 0טוען...

הגדר 'inParallel(tasks)' אסינכרון: בהינתן מערך של פונקציות המחזירות הבטחות, הפעל את כולן במקביל והחזר מערך תוצאות באותו סדר כמו הקלט. השתמש ב-Promise.all.

טוען עורך...
הצג רמז

Promise.all(tasks.map((t) => t()))

הפתרון זמין לאחר 3 ניסיונות