دروس الوحدة (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 من المحاولات