ÐекоÑаÑÐ¾Ñ 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):
let f = _.debounce(alert, 1000);
f("a");
setTimeout( () => f("b"), 200);
setTimeout( () => f("c"), 500);
// ÐбÑÑнÑÑÐ°Ñ Ð² debounce ÑÑнкÑÐ¸Ñ Ð¶Ð´ÑÑ 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 и оÑменÑÐµÑ Ð¿ÑедÑдÑÑий Ñакой Ñайм-аÑÑ.
ÐÑкÑÑÑÑ ÑеÑение Ñ ÑеÑÑами в пеÑоÑниÑе.
