Реализуйте класс 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);
Авторские решения и подсказки ко всем задачам доступны без ограничений с подпиской MaxCode Pro