0Pricing
JavaScript Academy · Урок

E3 — пул и очередь промисов (асинхронная параллельность)

Запускайте множество асинхронных задач с небольшим ограничением параллельности. Поддерживайте очередь, запускайте задачи небольшими группами и собирайте результаты

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

Что и зачем

Цель: запускать множество асинхронных задач, не перегружая систему.

  • Ограничивать параллельность (например, до 2 задач одновременно)
  • Хранить простой индекс очереди
  • Сохранять результаты в массиве
  • Писать понятный начинающим код с небольшими вспомогательными методами
E3 — пул и очередь промисов (асинхронная параллельность) — иллюстрация 1

Вспомогательный метод асинхронной задачи

Небольшой вспомогательный метод возвращает 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");
E3 — пул и очередь промисов (асинхронная параллельность) — иллюстрация 2

Реализация пула

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");
E3 — пул и очередь промисов (асинхронная параллельность) — иллюстрация 3

Запуск пула

Ограничьте число выполняющихся задач значением 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);
})();
E3 — пул и очередь промисов (асинхронная параллельность) — иллюстрация 4

Необязательная оболочка для повторных попыток

Оберните задачу небольшим вспомогательным методом 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);
})();
E3 — пул и очередь промисов (асинхронная параллельность) — иллюстрация 5

Рекомендации для начинающих

Советы:

  • Храните задачи как функции, возвращающие промисы.
  • Поддерживайте общий следующий индекс для очереди.
  • Обрабатывайте ошибки каждой задачи отдельно и сохраняйте результаты.
  • Для начинающих выбирайте небольшое ограничение — от 2 до 4.
E3 — пул и очередь промисов (асинхронная параллельность) — иллюстрация 6

Мини-викторина об ограничении параллелизма

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

E3 — пул и очередь промисов (асинхронная параллельность) — иллюстрация 7

Итоги

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

E3 — пул и очередь промисов (асинхронная параллельность) — иллюстрация 8

Часто задаваемые вопросы

Урок «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 — локальная установка не требуется.

Все уроки этого курса

  1. E1 — вычислитель выражений (часть 1: + и - слева направо)
  2. E2 — анализатор журналов (простые фильтры и счётчики)
  3. E3 — пул и очередь промисов (асинхронная параллельность)
← Назад к JavaScript Academy