Асинхронная очередь

Реализуйте класс AsyncQueue, который позволяет по очереди выполнять асинхронные функции.

С помощью метода add мы можем добавлять асинхронные функции. Если очередь свободная, мы сразу запускаем эту функцию. Если в данный момент какая-то функция выполняется (очередь занята), то новая функция должна быть запущена, когда очередь освободится.

Функции должны выполняться том же порядке, в котором добавлены. Функции не должны выполняться одновременно.

Функции, передаваемые в метод add, ничего не прнимают и обязаны возвращать промис, который в конечном счете завершается успешно. Метод add ничего не возвращает.

Каждый раз, когда функция выполнясется, необходимо вызвать колбэк, переданный в конструктор, с результатом работы этой функции.

Пример

Для локальной отладки можно создать вспомогательнуюб фунцию asyncFn, которая генерирует асинхронную функцию.

С помощью вызовов setTimeout мы эмулируем добавление в очередь в разное время.

const start = Date.now(); // создает асинхронную функцию, // которая завершается значением value через время ms const asyncFn = (value, ms) => () => { console.log("🏎️", value, "запущена в", Date.now() - start); return new Promise(resolve => setTimeout(resolve, ms, value)) .finally(() => console.log("🏁", value, "завершена в", Date.now() - start)) }; const q = new AsyncQueue((value) => console.log("✅", value)); setTimeout(() => q.add(asyncFn("A", 100)), 0); setTimeout(() => q.add(asyncFn("B", 200)), 0); setTimeout(() => q.add(asyncFn("C", 50)), 100); setTimeout(() => q.add(asyncFn("D", 100)), 150); setTimeout(() => q.add(asyncFn("E", 100)), 550); setTimeout(() => q.add(asyncFn("F", 200)), 600); setTimeout(() => q.add(asyncFn("G", 100)), 900);
  • A добавлена в очередь в 0 мс и сразу запустится, завершится через 100 мс после запуска (100 мс от начала)
  • B добавлена в очередь в 0 мс и запустится сразу после завершения A (100 мс), завершится через 200 мс после запуска (300 мс от начала)
  • C добавлена в очередь в 100 мс и запустится сразу после завершения B (300 мс), завершится через 50 мс после запуска (350 мс от начала)
  • D добавлена в очередь в 150 мс и запустится сразу после завершения C (350 мс), завершится через 100 мс после запуска (450 мс от начала), после этого очередь осовободится
  • E добавлена в очередь в 550 мс и запустится сразу (550 мс), т.к. очередь в этот момент свободна, завершится через 100 мс после запуска (650 мс от начала)
  • F добавлена в очередь в 600 мс и запустится сразу после завершения E (650 мс), завершится через 200 мс после запуска (850 мс от начала), после этого очередь осовободится
  • D добавлена в очередь в 900 мс и запустится сразу (900 мс), завершится через 100 мс после запуска (1000 мс от начала), после этого очередь осовободится

Авторские решения и подсказки ко всем задачам доступны без ограничений с подпиской MaxCode Pro

Моё решение

16px
Loading...
Отправить