Войти Регистрация
Фронтенд

31. Очередь загрузки виджетов СберБанк Онлайн с приоритетом

Сложная

Главная СберБанк Онлайн грузит 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 */ }
промисыочередьприоритетыасинхронность

Источник: на задачах Сбера: главная СберБанк Онлайн, виджеты. Условие пересказано своими словами.