ÐекоÑаÑÐ¾Ñ debounce
РезÑлÑÑÐ°Ñ Ð´ÐµÐºÐ¾ÑаÑоÑа debounce(f, ms) â Ñе обгоÑÑка, Ñо пÑизÑпинÑÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ¸ до f, поки не пÑойде ms мÑлÑÑекÑнд бездÑÑлÑноÑÑÑ (без викликÑв, âcooldown periodâ), а поÑÑм Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ñ f один Ñаз з оÑÑаннÑми аÑгÑменÑами.
ÐнÑими Ñловами, debounce â Ñе Ñк ÑекÑеÑаÑ, Ñкий пÑÐ¸Ð¹Ð¼Ð°Ñ âÑелеÑÐ¾Ð½Ð½Ñ Ð´Ð·Ð²Ñнкиâ, Ñ ÑекаÑ, поки не закÑнÑаÑÑÑÑ ms мÑлÑÑекÑнди ÑиÑÑ. РлиÑе ÑÐ¾Ð´Ñ Ð²Ñн пеÑÐµÐ´Ð°Ñ Ð¾ÑÑÐ°Ð½Ð½Ñ ÑнÑоÑмаÑÑÑ Ð¿Ñо виклик до âбоÑаâ (Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ñ ÑакÑиÑÐ½Ñ f).
ÐапÑиклад, ÑкÑо ми вÑзÑмемо ÑÑнкÑÑÑ f Ñ Ð·Ð°Ð¼Ñнимо ÑÑ Ð½Ð° f = debounce(f, 1000).
ТодÑ, ÑкÑо загоÑнÑÑа ÑÑнкÑÑÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°ÑÑÑÑÑ Ð¿Ñи 0 мÑ, 200 Ð¼Ñ Ñа 500 мÑ, а поÑÑм викликÑв немаÑ, Ñо ÑакÑиÑна f бÑде викликаÑиÑÑ Ð»Ð¸Ñе один Ñаз, пÑи 1500 мÑ. ТобÑо: пÑÑÐ»Ñ Ð·Ð°ÐºÑнÑÐµÐ½Ð½Ñ Ð¿ÐµÑÑÐ¾Ð´Ñ 1000 Ð¼Ñ Ð²Ñд оÑÑаннÑого викликÑ.
â¦Ð вона оÑÑÐ¸Ð¼Ð°Ñ Ð°ÑгÑменÑи Ñамого оÑÑаннÑого викликÑ, а ÑнÑÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ¸ бÑдÑÑÑ ÑгноÑÑваÑиÑÑ.
ÐÑÑ ÐºÐ¾Ð´ Ð´Ð»Ñ ÑÑого (викоÑиÑÑовÑÑ Ð´ÐµÐºÐ¾ÑаÑÐ¾Ñ debounce з Lodash library):
let f = _.debounce(alert, 1000);
f("a");
setTimeout( () => f("b"), 200);
setTimeout( () => f("c"), 500);
// повеÑнÑÑа з debounced ÑÑнкÑÑÑ ÑÐµÐºÐ°Ñ 1000 Ð¼Ñ Ð¿ÑÑÐ»Ñ Ð¾ÑÑаннÑого викликÑ, а поÑÑм запÑÑкаÑ: alert("c")
Ð¢ÐµÐ¿ÐµÑ Ð¿ÑакÑиÑний пÑиклад. СкажÑмо, коÑиÑÑÑÐ²Ð°Ñ Ð´ÑÑкÑÑ ÑоÑÑ, Ñ Ð¼Ð¸ Ñ Ð¾ÑÑли б надÑÑлаÑи Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° ÑеÑвеÑ, коли ввÑд закÑнÑиÑÑÑÑ.
ÐÐµÐ¼Ð°Ñ ÑенÑÑ Ð½Ð°Ð´ÑилаÑи Ð·Ð°Ð¿Ð¸Ñ Ð¿ÑÑÐ»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ введеного ÑимволÑ. ÐамÑÑÑÑ ÑÑого ми Ñ Ð¾ÑÑли б поÑекаÑи поки коÑиÑÑÑÐ²Ð°Ñ Ð·Ð°ÐºÑнÑиÑÑ Ð²Ð²Ð¾Ð´Ð¸Ñи ÑекÑÑ, а ÑÐ¾Ð´Ñ Ñже обÑоблÑÑи веÑÑ ÑезÑлÑÑаÑ.
У веббÑаÑзеÑÑ Ð¼Ð¸ можемо налаÑÑÑваÑи обÑобник подÑй â ÑÑнкÑÑÑ, Ñка викликаÑÑÑÑÑ Ð¿Ñи кожнÑй змÑÐ½Ñ Ð¿Ð¾Ð»Ñ Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ. ÐазвиÑай, обÑобник подÑй викликаÑÑÑÑÑ Ð´Ñже ÑаÑÑо, Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ дÑÑкованого ÑимволÑ. Ðле ÑкÑо ми викоÑиÑÑаÑмо debounce на 1000 мÑ, Ñо вÑн бÑде викликаÑиÑÑ Ð»Ð¸Ñе один Ñаз, ÑеÑез 1000 Ð¼Ñ Ð¿ÑÑÐ»Ñ Ð¾ÑÑаннÑого введеннÑ.
У ÑÑÐ¾Ð¼Ñ ÑеалÑÐ½Ð¾Ð¼Ñ Ð¿ÑÐ¸ÐºÐ»Ð°Ð´Ñ Ð¾Ð±Ñобник ÑÑавиÑÑ ÑезÑлÑÑÐ°Ñ Ñ Ð¿Ð¾Ð»Ðµ нижÑе, ÑпÑобÑйÑе Ñе:
ÐаÑиÑе? ÐÑÑгий ввÑд Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ñ ÑÑнкÑÑÑ, Ñо бÑла повеÑнÑÑа з debounce, ÑÐ¾Ð¼Ñ Ñей вмÑÑÑ Ð¾Ð±ÑоблÑÑÑÑÑÑ ÑеÑез 1000 Ð¼Ñ Ð· оÑÑаннÑого введеннÑ.
ÐÑже, debounce â Ñе ÑÑдовий ÑпоÑÑб обÑобки поÑлÑдовноÑÑÑ Ð¿Ð¾Ð´Ñй: бÑÐ´Ñ Ñо поÑлÑдовнÑÑÑÑ Ð½Ð°ÑиÑÐºÐ°Ð½Ð½Ñ ÐºÐ»Ð°Ð²ÑÑ, ÑÑÑ
Ñв миÑÑ Ð°Ð±Ð¾ ÑоÑÑ ÑнÑе.
ÐÑн ÑÐµÐºÐ°Ñ Ð¿ÐµÐ²Ð½Ð¾Ð³Ð¾ ÑаÑÑ Ð¿ÑÑÐ»Ñ Ð¾ÑÑаннÑого викликÑ, а поÑÑм запÑÑÐºÐ°Ñ ÑÐ²Ð¾Ñ ÑÑнкÑÑÑ, Ñка може обÑобиÑи ÑезÑлÑÑаÑ.
ÐÐ°Ð²Ð´Ð°Ð½Ð½Ñ Ð¿Ð¾Ð»ÑÐ³Ð°Ñ Ð² ÑомÑ, Ñоб ÑеалÑзÑваÑи декоÑаÑÐ¾Ñ debounce.
ÐÑдказка: Це лиÑе кÑлÑка ÑÑдкÑв, ÑкÑо ви дÑмаÑÑе пÑо Ñе :)
function debounce(func, ms) {
let timeout;
return function() {
clearTimeout(timeout);
timeout = setTimeout(() => func.apply(this, arguments), ms);
};
}
Ðиклик debounce повеÑÑÐ°Ñ Ð¾Ð±Ð³Ð¾ÑÑкÑ. Ðоли вÑн викликаÑÑÑÑÑ, вÑн вÑÐ´ÐºÐ»Ð°Ð´Ð°Ñ Ð²Ð¸ÐºÐ»Ð¸Ðº оÑигÑналÑÐ½Ð¾Ñ ÑÑнкÑÑÑ Ð¿ÑÑÐ»Ñ Ð´Ð°Ð½Ð¾Ð³Ð¾ ms Ñ ÑкаÑовÑÑ Ð¿Ð¾Ð¿ÐµÑеднÑй подÑбний Ñайм-аÑÑ.
ÐÑдкÑиÑи ÑÑÑÐµÐ½Ð½Ñ Ñз ÑеÑÑами в пÑÑоÑниÑÑ.