Debounce в React – Как задержать функцию JS

В разработке программного обеспечения есть несколько тяжелых задач. Возьмем, к примеру, вызов API. Предположим, у нас есть API, который выполняет поиск по списку пользователей, и мы не можем позволить себе запускать его слишком часто. Мы хотим выполнять поиск только после того, как ввели весь поисковый запрос.

Debouncing — это практика в разработке программного обеспечения , которая гарантирует, что некоторые тяжелые задачи, подобные приведенной выше, не выполняются так часто.

Когда использовать Debouncing

Давайте разберемся в этом на примере. Предположим, у нас есть элемент ввода, который получает некоторые данные, когда мы что-то печатаем. Например, допустим, мы набираем какой-нибудь пин-код, и он возвращает какие-то данные.

Но здесь есть одна загвоздка. Допустим, наш пин-код — 800001. Если мы введем первый символ, то есть 8, мы отправим запрос на внутренний сервер. Затем набираем 0 и отправим на сервер еще один запрос и так далее. 

Это вызывает API очень много раз и, в свою очередь, чрезмерно использует запросы. Итак, чтобы предотвратить это, мы используем так называемую функцию устранения дребезга.

Для этого у нас есть функция в JavaScript под названием Debouncing.

Debouncing в JavaScript – практический пример

В приведенном ниже примере мы просто вызываем API, используя метод axios.get , когда вводим любой числовой символ в поле ввода.

Входной символ передается функции в качестве аргумента, а значение передается в качестве параметров пути. Мы также регистрируем ответ в консоли.

import axios from "axios";
import React from "react";
import "./styles.css";

export default function App() {
  const setInput = (value) => {
    axios
      .get(`https://api.postalpincode.in/pincode/${value}`)
      .then((response) => {
        console.log(response.data[0]?.PostOffice[0]);
      });
  };
  return (
    <div className="app">
      <input
        placeholder="Search Input.."
        onChange={(e) => setInput(e.target.value)}
      />
    </div>
  );
}

Но загвоздка в том, что каждый раз, когда мы пишем символ, срабатывает наш API. Итак, возвращаясь к нашему примеру выше, допустим, мы хотим ввести 800001. Опять же, как только мы наберем 8, API будет запущен и будет искать символ 8. Затем мы наберем 0 (ноль), и API будет искать 80 и так далее.

Теперь давайте изменим весь поток, чтобы добавить Debouncing. В случае Debouncing API сработает только один раз через 2 секунды, после того как мы введем весь пин-код.

Прежде всего, создайте state, используя хук useState в React.

const [pinCode, setPinCode] = React.useState("");

Теперь нам нужно установить данные в состояние pinCode , когда мы что-то печатаем, используя обработчик событий onChange .

<input
      placeholder="Search Input.."
      onChange={(event) => setPinCode(event.target.value)}
 />

Теперь давайте создадим хук useEffect , который будет запускаться каждый раз, когда меняется наш пин-код или когда мы вводим что-то в поле поиска.

React.useEffect(() => {

}, [pinCode])

В этом хуке useEffect у нас будет функция getData . Эта функция getData будет иметь функцию обратного вызова setTimeOut . И установим таймер на 2 секунды.

React.useEffect(() => {
    const getData = setTimeout(() => {
      
    }, 2000)
}, [pinCode])

А теперь в этой функции getData давайте вызовем наш API.

React.useEffect(() => {
    const getData = setTimeout(() => {
      axios
      .get(`https://api.postalpincode.in/pincode/${pinCode}`)
      .then((response) => {
        console.log(response.data[0]);
      });
    }, 2000)
}, [pinCode])

Нам также нужно будет уничтожить экземпляр перехватчика useEffect, используя return , а затем ClearTimeout , каждый раз, когда он завершается.

React.useEffect(() => {
    const getData = setTimeout(() => {
      axios
      .get(`https://api.postalpincode.in/pincode/${pinCode}`)
      .then((response) => {
        console.log(response.data[0]);
      });
    }, 2000)

    return () => clearTimeout(getData)
  }, [pinCode])

И мы закончили. Давайте введем что-нибудь во входные данные, и через 2 секунды мы получим результаты.

Скриншот-2022-06-11-200335

Подведение итогов

Теперь вы знаете, как и зачем использовать функцию Debouncing. Так просто и легко, правда?

Теперь, если мы введем какой-либо поисковый запрос во входные данные, он отобразится через 2 секунды, как только мы перестанем изменять входные данные. И для этого мы использовали debouncing .



Существует множество применений Debouncing. Мы можем использовать его, чтобы не задействовать наш API снова и снова. И мы можем использовать его, чтобы гарантировать, что данные формы будут отправлены только один раз, даже если мы нажмем кнопку отправки несколько раз.