Карточка товара 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: карточка товара, срок доставки. Условие пересказано своими словами.
Ожидаемый ответ не нужен: покажем, что вернула функция.
Здесь появится результат отправки.