Уроки модуля (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)` асинхронно: учитывая массив функций, возвращающих обещания, запускайте их по одному (ожидайте) и возвращайте массив результатов в порядке выполнения.
Показать подсказку
for... of and push(await t())
Решение доступно после 3 попыток
Обзор упражнения
Определите async `inParallel(tasks)`: учитывая массив функций, возвращающих обещания, запустите их все параллельно и верните массив результатов в том же порядке, что и входные данные. Используйте Promise.all.
Показать подсказку
Promise.all(tasks.map((t) => t()))
Решение доступно после 3 попыток