Модульні уроки (4/4)
Завдання: планування за допомогою Promises
«Планування» означає рішення, як запускати список асинхронних завдань: усі разом, по одному,
або невеликими групами. Ми об’єднаємо 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)` async: задано масив функцій, які повертають Promises, запускайте їх по черзі (очікуйте) і повертайте масив результатів у порядку виконання.
Показати підказку
for ... of і push(await t())
Рішення доступне після 3 спроб
Повторна вправа
Визначте `inParallel(tasks)` async: задано масив функцій, які повертають Promises, запустіть їх усі паралельно та поверніть масив результатів у тому самому порядку, що й вхідні дані. Використовуйте Promise.all.
Показати підказку
Promise.all(tasks.map((t) => t()))
Рішення доступне після 3 спроб