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

30. Срок доставки Ozon: ждём ответ не дольше секунды

Лёгкая

Карточка товара Ozon спрашивает у сервиса доставки точную дату: «Привезём 24 октября». В час пик сервис отвечает по 6–8 секунд, а карточка без даты не рисуется. Решили ждать 1000 мс, а потом показывать общее «от 1 дня».

Напишите withTimeout(promise, ms). Если promise выполнился раньше, чем прошло ms, вернуть его результат или его ошибку. Иначе отклонить ошибкой с name === 'TimeoutError' и сообщением Таймаут <ms> мс.

Когда исходный промис выполнился, таймер таймаута надо снять: на странице 40 карточек, и висящие таймеры копятся. Вместо промиса может прийти обычное значение — его вернуть сразу.

В работе: Запросы к медленным сервисам, ожидание ответа воркера, загрузка сторонних скриптов.

Пример 1: сервис ответил быстро

Аргументы теста
[120, "24 октября", true], 1000
Ожидается
{"status": "ok", "value": "24 октября", "at": 120, "left": 0}

Пример 2: сервис тормозит

Аргументы теста
[7000, "24 октября", true], 1000
Ожидается
{"status": "error", "name": "TimeoutError", "message": "Таймаут 1000 мс", "at": 1000, "left": 1}
Как проверяем Объявите withTimeout — тест вызывает её сам. Таймеры и Date в тестах ненастоящие: время идёт по команде теста, поэтому setTimeout на 5 секунд проверяется мгновенно. Тестов 6: 2 открыты выше, остальные приходят после старта подхода. Лимит — 2 с на тест.
function withTimeout(promise, ms) // → Promise
промисытаймеры

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