Skip to content

Commit

Permalink
Слегка редачит
Browse files Browse the repository at this point in the history
  • Loading branch information
TatianaFokina authored Sep 21, 2024
1 parent 22cbcf4 commit 6e7abf3
Showing 1 changed file with 14 additions and 18 deletions.
32 changes: 14 additions & 18 deletions js/debounce/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -239,28 +239,26 @@ const server = {

```javascript
function debounce(callback, delay) {
let timer;
let timer
return function perform(...args) {
clearTimeout(timer);
timer = setTimeout(() => { callback.apply(this, args); }, delay);
};
clearTimeout(timer)
timer = setTimeout(() => { callback.apply(this, args) }, delay)
}
}
```

Как работает функция `perform`:

1. При вызове функции `perform`, сначала выполняется `clearTimeout(timer)`. Так удаляется ранее установленный таймер, если он существует. Это необходимо, чтобы предотвратить выполнение предыдущего вызова функции `callback`, если новый вызов произошёл до завершения задержки.
1. Устанавливается новый таймер с помощью `setTimeout`, и ссылка на этот таймер сохраняется в переменной `timer`.
1. В `setTimeout` первым аргументом передаётся стрелочная функция с вызовом нашего `callback` c привязкой контектса и передачей всех аргументов. Вторым аргументом передаётся задержка `delay`.

1. Затем устанавливается новый таймер с помощью `setTimeout`, и ссылка на этот таймер сохраняется в переменной `timer`.
Отметим несколько важных моментов:

1. В `setTimeout` первым аргументом передается стрелочная функция с вызовом нашего `callback` c привязкой контектса и передачей всех аргументов. Вторым аргументом передается задержка `delay`.
- возвращаемая функция `perform` НЕ должна быть стрелочной, чтобы не терялся контекст;
- чтобы `callback` функция, передаваемая в `setTimeout`, не потеряла контекст, его нужно привязать с помощью `apply`. Это важно при работе с обработчиком событий браузера.

Важно отметить, несколько моментов:
- возвращаемая функция `perform` НЕ должна быть стрелочной, чтобы не терялся контекст.
- чтобы `callback` функция передаваемая в `setTimeout` не потеряла контекст его нужно привязать с помощью `apply`. Это важно при работе с обработчиком событий браузера.


Использовать такой `debounce()` мы можем так:
Использовать `debounce()` мы можем так:

```javascript
// Функция, которую хотим «откладывать»
Expand All @@ -280,7 +278,7 @@ debouncedDoSomething(42)

## Применяем `debounce()`

Теперь мы можем применить `debounce()` в нашем обработчике. Сперва немного порефакторим. Вынесем обработчик события в отдельную функцию. Внутри она будет такой же, но так нам удобнее оборачивать её в `debounce()`.
Теперь применим `debounce()` в нашем обработчике. Сперва немного порефакторим. Вынесем обработчик события в отдельную функцию. Внутри она будет такой же, но так нам удобнее оборачивать её в `debounce()`.

```javascript
function handleInput(e) {
Expand All @@ -300,7 +298,7 @@ function handleInput(e) {
searchInput.addEventListener('input', handleInput)
```

Теперь обернём вынесенную функцию и обновим `addEventListener`. Укажем, что нам нужно ждать 250 мс, прежде чем запустить обработчик. Дальше передаём новую `debounced`-функцию в `addEventListener`.
Обернём вынесенную функцию и обновим `addEventListener`. Укажем, что нам нужно ждать 250 мс, прежде чем запустить обработчик. Дальше передаём новую `debounced`-функцию в `addEventListener`.

```javascript
function handleInput(e) {
Expand All @@ -318,12 +316,10 @@ searchInput.addEventListener('input', debouncedHandle)

Вместо пяти запросов теперь отправляем всего один!

Обратите внимание, что API функции не поменялось. Мы как передавали [`event`](/js/event/), так и передаём. То есть для внешнего мира debounced-функция ведёт себя точно так же, как и простая функция-обработчик.

Это удобно, потому что меняется лишь одна небольшая часть программы, не затрагивая системы в целом.
Обратите внимание, что API функции не поменялось. Мы как передавали [`event`](/js/event/), так и передаём. То есть для внешнего мира debounced-функция ведёт себя точно так же, как и простая функция-обработчик. Это удобно, потому что меняется лишь одна небольшая часть программы, не затрагивая системы в целом.

### Результат

Полный пример строки поиска у нас получится такой:

<iframe title="Откладывание запросов при поиске — Debounce на примере формы поиска — Дока" src="demos/debounced-search/" height="280"></iframe>
<iframe title="Откладывание запросов при поиске" src="demos/debounced-search/" height="280"></iframe>

0 comments on commit 6e7abf3

Please sign in to comment.