Честно говоря, я делаю это вручную. Обратите внимание на различия между debouncing и дросселированием . Я думаю, вы хотите ограничить количество запросов. Если вы откажетесь, ничего не произойдет, пока не закончится таймер.
Если вы хотите подождать 10 секунд, как в вашем примере, ничего не должно произойти, если пользователь вводит хотя бы один раз каждые десять секунд, до 10 секунд после последний тип. В отличие от дросселирования, при котором запрос будет go отправляться каждые 10 секунд.
Этот подход является своего рода гибридом, потому что мы следим за тем, чтобы последний из них все еще выходил (как это было бы при устранении неполадок), а дросселирование может нет, но мы по-прежнему отправляем запросы, пока пользователь печатает.
const timer = useRef<number>(0);
const lastEventSent = useRef(Date.now());
useEffect(() => {
if (Date.now() - lastEventSent.current < 500) {
// The event was fired too recently, but we still want
// to fire this event after the timeout if it is the last
// one (500ms in this case).
timer.current = setTimeout(() => {
lastEventSent.current = Date.now();
props.getPartners(query)
}, 500);
} else {
// An event hasn't been fired for 500ms, lets fire the event
props.getPartners(query)
lastEventSent.current = Date.now();
// And if the user was typing, there is probably a timer, lets clear that
clearTimeout(timer.current);
}
// Cleanup the timer if there was one and this effect is reloaded.
return () => clearTimeout(timer.current);
}, [query]);