debounce: Параметр invokeAsap не должен отключать отложенный вызов
В статье https://habr.com/ru/post/60957/ сказано про debounce:
- ...
- Реальный вызов происходит сразу, а все остальные попытки вызова игнорируются, пока не пройдет время, большее или равное задержке, отсчитанной от времени последней попытки.
Но сейчас реализация не соответствует этому описанию, потому что при использовании второго варианта происходит только первый мгновенный вызов, а последний после окончания задержки не выполняется.
Да, там код не совсем корректен. Но твой вариант тоже неправильно работает: если просто один раз позвать "задебаунсенную" функцию с invokeAsap=true, то это приведет к двум вызовам исходной функции, а так не должно быть. По-хорошему там нужен еще один флаг, который будет отвечать за то, что исходная функция была позвана в "invokeAsap" варианте и проверять это в вызове по таймеру, чтобы не звать ее второй раз.
Ps. А зачем ты это используешь? Это какое-то древнее говно мамонта )
На работе случилось недопонимание касаемо debounce и throttle, ну я пошёл открывать твою статью на хабре, за неё отдельное спасибо, кстати, очень понятная :-) Потом заглянул в исходники и понял, что работает оно не так и решил исправить, тем более задача интересная.
Исправил. Дополнительной переменной здесь не отделаться, как я понимаю, потому что надо её как-то сбрасывать не только после череды вызовов, но и между отдельными одиночными вызовами, а запускать ещё один таймер кажется нерационально, поэтому пришёл к тому, что надо проверять время вызова.