E3 — пул и очередь промисов (асинхронная параллельность)
Запускайте множество асинхронных задач с небольшим ограничением параллельности. Поддерживайте очередь, запускайте задачи небольшими группами и собирайте результаты
«E3 — пул и очередь промисов (асинхронная параллельность)» — бесплатный урок JavaScript Academy на CoddyKit. Это урок 3 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения JavaScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс JavaScript Academy содержит 3 уроков всего.
Что и зачем
Цель: запускать множество асинхронных задач, не перегружая систему.
- Ограничивать параллельность (например, до 2 задач одновременно)
- Хранить простой индекс очереди
- Сохранять результаты в массиве
- Писать понятный начинающим код с небольшими вспомогательными методами

Вспомогательный метод асинхронной задачи
Небольшой вспомогательный метод возвращает Promise, который выполняется после задержки; при необходимости он завершается ошибкой для тестирования.
// Simulate async work with setTimeout
function fakeJob(name, ms, fail) {
return new Promise(function (resolve, reject) {
setTimeout(function () {
if (fail) {
reject(new Error("fail:" + name));
} else {
resolve("done:" + name);
}
}, ms);
});
}
console.log("demo job:", typeof fakeJob === "function");
Реализация пула
runPool запускает несколько рабочих методов; каждый получает индекс следующей задачи и ожидает её завершения. Результаты сохраняют порядок входных данных.
// Run tasks with a fixed concurrency limit
async function runPool(tasks, limit) {
// tasks: array of functions () => Promise<any>
const results = new Array(tasks.length);
let next = 0;
// worker runs tasks until none left
async function worker() {
while (true) {
const i = next;
if (i >= tasks.length) return;
next = next + 1;
try {
const value = await tasks[i]();
results[i] = { ok: true, value: value };
} catch (e) {
results[i] = { ok: false, error: String(e) };
}
}
}
// start up to limit workers
const workers = [];
for (let k = 0; k < limit; k = k + 1) {
workers.push(worker());
}
await Promise.all(workers);
return results;
}
console.log("pool ready:", typeof runPool === "function");
Запуск пула
Ограничьте число выполняющихся задач значением 2. Массив сохраняет порядок: индекс i содержит результат задачи i.
// Prepare simple tasks
const jobs = [
function () { return fakeJob("A", 300, false); },
function () { return fakeJob("B", 200, false); },
function () { return fakeJob("C", 150, true ); },
function () { return fakeJob("D", 100, false); }
];
// Run with concurrency = 2
(async function () {
const out = await runPool(jobs, 2);
console.log("results:", out);
})();
Необязательная оболочка для повторных попыток
Оберните задачу небольшим вспомогательным методом withRetry. Используйте небольшие числа и простую логику.
// Optional: add retry to a task wrapper (beginner-friendly)
function withRetry(task, attempts) {
return async function () {
let lastErr = null;
for (let i = 0; i < attempts; i = i + 1) {
try {
return await task();
} catch (e) {
lastErr = e;
}
}
throw lastErr;
};
}
const jobsWithRetry = [
withRetry(function () { return fakeJob("R1", 80, true); }, 2),
withRetry(function () { return fakeJob("R2", 60, false); }, 2)
];
(async function () {
const out = await runPool(jobsWithRetry, 1);
console.log("retry results:", out);
})();
Рекомендации для начинающих
Советы:
- Храните задачи как функции, возвращающие промисы.
- Поддерживайте общий следующий индекс для очереди.
- Обрабатывайте ошибки каждой задачи отдельно и сохраняйте результаты.
- Для начинающих выбирайте небольшое ограничение — от 2 до 4.

Мини-викторина об ограничении параллелизма
Быстрая проверка: зачем нужен пул?

Итоги
Итоги: небольшой пул промисов запускает задачи с фиксированным ограничением, сохраняет их порядок в массиве результатов и использует простую обработку ошибок для каждой задачи. Отличный шаблон для начинающих.

Часто задаваемые вопросы
Урок «E3 — пул и очередь промисов (асинхронная параллельность)» бесплатный?
Да — полный текст урока «E3 — пул и очередь промисов (асинхронная параллельность)» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс JavaScript Academy, подпишись на CoddyKit PRO. Курс JavaScript Academy содержит 3 уроков всего.
Чему я научусь в уроке «E3 — пул и очередь промисов (асинхронная параллельность)»?
Запускайте множество асинхронных задач с небольшим ограничением параллельности. Поддерживайте очередь, запускайте задачи небольшими группами и собирайте результаты Ты практикуешь JavaScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать JavaScript Academy?
Предыдущий опыт не требуется. JavaScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 3.
Сколько времени занимает урок «E3 — пул и очередь промисов (асинхронная параллельность)»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке JavaScript Academy?
Да. Каждый урок JavaScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- E1 — вычислитель выражений (часть 1: + и - слева направо)
- E2 — анализатор журналов (простые фильтры и счётчики)
- E3 — пул и очередь промисов (асинхронная параллельность)