الانتقال إلى المحتوى الرئيسي
الوحدة 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 من المحاولات