В переводах Т‑Банка поле «Кому» ищет получателя по имени и номеру. Запрос к поиску уходит на каждую букву: за фразу «Анна Петровна» это 13 запросов, а ответы приходят вразнобой.
Напишите debounce(fn, ms, { leading = false, trailing = true } = {}). Обёртка откладывает вызов: каждый новый вызов перезапускает таймер на ms. Когда таймер дотикал, окно закрыто.
trailing: true — после закрытия окна вызвать fn с аргументами последнего вызова. leading: true — вызов, открывший окно, выполняется сразу. Если включены оба, а вызов в окне был один, fn срабатывает один раз, в начале.
У обёртки есть метод cancel(): снимает таймер и забывает отложенный вызов. Следующий вызов открывает окно заново.
В работе: Поиск по мере набора, автосохранение черновика, пересчёт при resize.
Пример 1: набор подряд: один запрос после паузы
300, null, [[0, "call", "а"], [100, "call", "ан"], [200, "call", "анн"]]
[[500, "анн"]]
Пример 2: две паузы — два запроса
300, null, [[0, "call", "и"], [400, "call", "ив"]]
[[300, "и"], [700, "ив"]]
debounce — тест вызывает её сам. Таймеры и Date в тестах ненастоящие: время идёт по команде теста, поэтому setTimeout на 5 секунд проверяется мгновенно. Тестов 10: 2 открыты выше, остальные приходят после старта подхода. Лимит — 2 с на тест.
function debounce(fn, ms, { leading, trailing } = {}) // → функция с методом cancel()
Источник: обзор транскриптов интервью: Т‑Банк, поиск с debounce. Условие пересказано своими словами.
Ожидаемый ответ не нужен: покажем, что вернула функция.
Здесь появится результат отправки.