Conversation
debounce()
edfd95f to
22cbcf4
Compare
|
@vitya-ne Что скажешь по тексту объяснения? Норм? |
По смыслу все верно, но есть, как мне кажется, неточности )
|
|
|
||
| Отметим несколько важных моментов: | ||
|
|
||
| - возвращаемая функция `perform` НЕ должна быть стрелочной, чтобы не терялся контекст; |
There was a problem hiding this comment.
Давайте тут уточним:
- возвращаемая функция
performНЕ должна быть стрелочной, чтобы не терялся контекстcallbackфункции;
There was a problem hiding this comment.
Мне кажется это не очень хорошая рекомендация. Я бы постаралась избегать неявных this bindings.
Я предположу что здесь проблема в том что this теряет контекст кликнутого элемента. Для таких случаев я бы просто использовала currentTarget. Для классов - стрелочную функцию метод
There was a problem hiding this comment.
С другой стороны хуже от этого не будет. Давайте так: если вы хотите сохранить контекст колбек-метода не используйте стрелочную функцию для perform. Мелкое различие которое не так сильно заостряет на этом внимание )
| Отметим несколько важных моментов: | ||
|
|
||
| - возвращаемая функция `perform` НЕ должна быть стрелочной, чтобы не терялся контекст; | ||
| - чтобы `callback` функция, передаваемая в `setTimeout`, не потеряла контекст, его нужно привязать с помощью `apply`. Это важно при работе с обработчиком событий браузера. |
There was a problem hiding this comment.
Давайте тут тоже уточним:
- чтобы
callbackфункция, передаваемая вsetTimeout, получила контекст, укажем его с помощьюapply. Это важно при использовании debounce для обработчиков событий браузера.
|
@HellSquirrel приди, функции погляди! |
|
|
||
| Отметим несколько важных моментов: | ||
|
|
||
| - возвращаемая функция `perform` НЕ должна быть стрелочной, чтобы не терялся контекст; |
There was a problem hiding this comment.
Мне кажется это не очень хорошая рекомендация. Я бы постаралась избегать неявных this bindings.
Я предположу что здесь проблема в том что this теряет контекст кликнутого элемента. Для таких случаев я бы просто использовала currentTarget. Для классов - стрелочную функцию метод
|
|
||
| 1. При вызове функции `perform`, сначала выполняется `clearTimeout(timer)`. Так удаляется ранее установленный таймер, если он существует. Это необходимо, чтобы предотвратить выполнение предыдущего вызова функции `callback`, если новый вызов произошёл до завершения задержки. | ||
| 1. Устанавливается новый таймер с помощью `setTimeout`, и ссылка на этот таймер сохраняется в переменной `timer`. | ||
| 1. В `setTimeout` первым аргументом передаётся стрелочная функция с вызовом нашего `callback` c привязкой контектса и передачей всех аргументов. Вторым аргументом передаётся задержка `delay`. |
There was a problem hiding this comment.
| 1. В `setTimeout` первым аргументом передаётся стрелочная функция с вызовом нашего `callback` c привязкой контектса и передачей всех аргументов. Вторым аргументом передаётся задержка `delay`. | |
| 1. В `setTimeout` первым аргументом передаётся стрелочная функция с вызовом нашего `callback` c привязкой контекста и передачей всех аргументов. Вторым аргументом передаётся задержка `delay`. |
| Обратите внимание, что API функции не поменялось. Мы как передавали [`event`](/js/event/), так и передаём. То есть для внешнего мира debounced-функция ведёт себя точно так же, как и простая функция-обработчик. | ||
|
|
||
| Это удобно, потому что меняется лишь одна небольшая часть программы, не затрагивая системы в целом. | ||
| Обратите внимание, что API функции не поменялось. Мы как передавали [`event`](/js/event/), так и передаём. То есть для внешнего мира debounced-функция ведёт себя точно так же, как и простая функция-обработчик. Это удобно, потому что меняется лишь одна небольшая часть программы, не затрагивая системы в целом. |
There was a problem hiding this comment.
Кстати api поменялось. Синхронная функция - обработчик могла возвращать значение, debounce версия этого делать не может
она нужна, чтобы результат поиска помещался в окошко
Превью контента из 6524345 опубликовано. |
Описание
Переписал функцию debounce() на более простой вариант без проверки времени и переделал описание работы.
Вот пример проблемы с которой столкнулся: https://jsbin.com/ceqetosabi/2/edit?js,console
Чек-лист
/css/color/,/tools/json/,/tools/gulp/#kak-ponyat)images/example.png,demos/example/,../demos/example/)