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

91. Цены карточек Wildberries одним запросом: свой DataLoader

Сложная

Выдача Wildberries рисует 100 карточек, и каждая сама просит свою цену. 100 запросов к API цен — это 100 рукопожатий и лимит по частоте. API умеет отдавать цены пачкой: POST /prices с массивом артикулов.

Напишите createLoader(batchFn, { maxBatch = 50, waitMs = 10 } = {}). Функция возвращает load(id) → промис цены. Первый load после паузы запускает таймер на waitMs; все id, пришедшие до срабатывания, уходят вместе. Повторы id в одной пачке не дублируются, оба вызова получают один ответ. Пачка длиннее maxBatch режется на несколько вызовов batchFn по порядку.

batchFn(ids) возвращает промис массива той же длины, что ids. Элемент-Error значит, что цена этого артикула не нашлась: отклоняется только его load. Если отклонился сам batchFn, отклоняются все load этой пачки.

Успешные цены кэшируются: следующий load того же id возвращает их без запроса. Ошибки не кэшируются.

В работе: Выдача каталога: 100 карточек на экран, вместо 100 запросов цены — 2 по 50 артикулов.

Пример 1: три карточки — одна пачка

Аргументы теста
{"waitMs": 10}, [[0, "101"], [3, "102"], [9, "103"]]
Ожидается
{"batches": [[10, ["101", "102", "103"]]], "results": ["101 ok цена:101 @60", "102 ok цена:102 @60", "103 ok цена:103 @60"]}

Пример 2: повтор id в пачке

Аргументы теста
{"waitMs": 10}, [[0, "7"], [1, "7"], [2, "8"]]
Ожидается
{"batches": [[10, ["7", "8"]]], "results": ["7 ok цена:7 @60", "7 ok цена:7 @60", "8 ok цена:8 @60"]}
Как проверяем Объявите createLoader — тест вызывает её сам. Таймеры и Date в тестах ненастоящие: время идёт по команде теста, поэтому setTimeout на 5 секунд проверяется мгновенно. Тестов 8: 2 открыты выше, остальные приходят после старта подхода. Лимит — 2 с на тест.
function createLoader(batchFn, { maxBatch, waitMs } = {}) // → load(id): Promise
промисытаймерыбатчингкэш

Источник: на задачах Wildberries: выдача каталога, цены и остатки. Условие пересказано своими словами.