Главная СберБанк Онлайн грузит 9 виджетов: карты, вклады, кешбэк, предложения. Браузер на слабом телефоне захлёбывается, поэтому одновременно идут только 2 запроса. Баланс карт важнее предложений: у него приоритет 10, у предложений 0.
Напишите класс TaskQueue(concurrency). Метод add(task, priority = 0) принимает функцию без аргументов, которая возвращает промис, и возвращает промис с её результатом или ошибкой.
Одновременно выполняется не больше concurrency задач. Когда место освободилось, запускается задача с наибольшим priority среди ждущих; при равном приоритете — добавленная раньше. Задача, добавленная позже с большим приоритетом, обгоняет ждущие.
Ошибка задачи отклоняет только её промис, очередь работает дальше.
В работе: Загрузка виджетов и картинок, фоновая синхронизация, очередь запросов к API с лимитом.
Пример 1: приоритет обгоняет
1, [[0, "предложения", 100, 0, false], [0, "вклады", 100, 0, false], [0, "карты", 100, 10, false]]
{"starts": ["0 предложения", "100 карты", "200 вклады"], "results": ["вклады ok 300", "карты ok 200", "предложения ok 100"]}Пример 2: равный приоритет — по очереди
1, [[0, "A", 100, 5, false], [0, "B", 100, 5, false], [0, "C", 100, 5, false], [0, "D", 100, 5, false]]
{"starts": ["0 A", "100 B", "200 C", "300 D"], "results": ["A ok 100", "B ok 200", "C ok 300", "D ok 400"]}TaskQueue — тест вызывает её сам. Таймеры и Date в тестах ненастоящие: время идёт по команде теста, поэтому setTimeout на 5 секунд проверяется мгновенно. Тестов 8: 2 открыты выше, остальные приходят после старта подхода. Лимит — 2 с на тест.
class TaskQueue { constructor(concurrency); add(task, priority = 0) /* → Promise */ }
Источник: на задачах Сбера: главная СберБанк Онлайн, виджеты. Условие пересказано своими словами.
Ожидаемый ответ не нужен: покажем, что вернула функция.
Здесь появится результат отправки.