ÐÑоÑелÑний (throttle) декоÑаÑоÑ
СÑвоÑÑÑÑ âдÑоÑелÑнийâ декоÑаÑÐ¾Ñ throttle(f, ms) â Ñо повеÑÑÐ°Ñ Ð¾Ð±Ð³Ð¾ÑÑкÑ.
Ðоли вÑн викликаÑÑÑÑÑ ÐºÑлÑка ÑазÑв, вÑн пеÑÐµÐ´Ð°Ñ Ð²Ð¸ÐºÐ»Ð¸Ðº до f макÑимÑм один Ñаз на ms мÑлÑÑекÑнд.
Ð ÑзниÑÑ Ð· debounce полÑÐ³Ð°Ñ Ð² ÑомÑ, Ñо Ñе зовÑÑм ÑнÑий декоÑаÑоÑ:
debounceзапÑÑÐºÐ°Ñ ÑÑнкÑÑÑ Ð¾Ð´Ð¸Ð½ Ñаз пÑÑÐ»Ñ Ð¿ÐµÑÑÐ¾Ð´Ñ âÑпокоÑâ. Це добÑе Ð´Ð»Ñ Ð¾Ð±Ñобки кÑнÑевого ÑезÑлÑÑаÑÑ.throttleзапÑÑÐºÐ°Ñ ÑÑнкÑÑÑ Ð½Ðµ ÑаÑÑÑÑе, нÑж даноmsÑаÑÑ. Це добÑе Ð´Ð»Ñ ÑегÑлÑÑÐ½Ð¸Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ñ, ÑÐºÑ Ð½Ðµ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð±ÑÑи дÑже ÑаÑÑо.
ÐнÑими Ñловами, throttle â Ñе Ñк ÑекÑеÑаÑ, Ñкий пÑÐ¸Ð¹Ð¼Ð°Ñ ÑелеÑÐ¾Ð½Ð½Ñ Ð´Ð·Ð²Ñнки, але ÑÑÑбÑÑ Ð±Ð¾Ñа (Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ñ ÑакÑиÑÐ½Ñ f) не ÑаÑÑÑÑе, нÑж один Ñаз на ms мÑлÑÑекÑнд.
ÐеÑевÑÑмо заÑÑоÑÑнок з ÑеалÑного жиÑÑÑ, Ñоб кÑаÑе зÑозÑмÑÑи ÑÑ Ð²Ð¸Ð¼Ð¾Ð³Ñ Ñа побаÑиÑи, звÑдки вона Ð¿Ð¾Ñ Ð¾Ð´Ð¸ÑÑ.
ÐапÑиклад, ми Ñ Ð¾Ñемо вÑдÑÑежÑваÑи ÑÑÑ Ð¸ миÑÑ.
У бÑаÑзеÑÑ Ð¼Ð¸ можемо налаÑÑÑваÑи запÑÑкаÑи ÑÑнкÑÑÑ Ð¿Ñи ÐºÐ¾Ð¶Ð½Ð¾Ð¼Ñ ÑÑÑÑ Ð¼Ð¸ÑÑ Ñа оÑÑимаÑи мÑÑÑе кÑÑÑоÑÑ Ñа Ñе, Ñк вÑн ÑÑÑ Ð°ÑÑÑÑÑ. ÐÑд ÑÐ°Ñ Ð°ÐºÑивного викоÑиÑÑÐ°Ð½Ð½Ñ Ð¼Ð¸ÑÑ ÑÑ ÑÑнкÑÑÑ Ð·Ð°Ð·Ð²Ð¸Ñай пÑаÑÑÑ Ð´Ñже ÑаÑÑо, може бÑÑи ÑоÑÑ Ð½Ð° зÑазок 100 ÑазÑв на ÑекÑÐ½Ð´Ñ (ÐºÐ¾Ð¶Ð½Ñ 10 мÑ). Ðи Ñ Ð¾ÑÑли б оновиÑи деÑÐºÑ ÑнÑоÑмаÑÑÑ Ð½Ð° вебÑÑоÑÑнÑÑ, коли кÑÑÑÐ¾Ñ ÑÑÑ Ð°ÑÑÑÑÑ.
â¦Ðле ÑÑнкÑÑÑ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ update() занадÑо ÑÑжка, Ñоб виконÑваÑи ÑÑ Ð¿ÑÑÐ»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ найменÑого ÑÑÑ
Ñ Ð¼Ð¸ÑÑ. Та й нам Ð½ÐµÐ¼Ð°Ñ ÑенÑÑ Ð² Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÑаÑÑÑÑе, нÑж один Ñаз на 100 мÑ.
ÐÑже, ми загоÑнемо ÑÑ Ð² декоÑаÑоÑ: викоÑиÑÑаÑмо throttle(update, 100) Ñк ÑÑнкÑÑÑ Ð´Ð»Ñ Ð·Ð°Ð¿ÑÑÐºÑ Ð¿ÑÑÐ»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ ÑÑÑ
Ñ Ð¼Ð¸ÑÑ Ð·Ð°Ð¼ÑÑÑÑ Ð¾ÑигÑналÑного update(). Сам декоÑаÑÐ¾Ñ Ð±Ñде викликаÑиÑÑ ÑаÑÑо, але пеÑедаваÑиме виклик до update() макÑимÑм один Ñаз на 100 мÑ.
ÐÑзÑалÑно, Ñе бÑде виглÑдаÑи Ñак:
- ÐÐ»Ñ Ð¿ÐµÑÑого ÑÑÑ
Ñ Ð¼Ð¸ÑÑ Ð´ÐµÐºÐ¾Ñований ваÑÑÐ°Ð½Ñ Ð½ÐµÐ³Ð°Ð¹Ð½Ð¾ пеÑÐµÐ´Ð°Ñ Ð²Ð¸ÐºÐ»Ð¸Ðº до
update. Це важливо, Ñоб коÑиÑÑÑÐ²Ð°Ñ Ð½ÐµÐ³Ð°Ð¹Ð½Ð¾ побаÑив наÑÑ ÑеакÑÑÑ Ð½Ð° його ÑÑÑ . - ÐÑÑÐ»Ñ Ñого, Ñк миÑа ÑÑÑ
аÑÑÑÑÑ, до
100msнÑÑого не вÑдбÑваÑÑÑÑÑ. ÐекоÑований ваÑÑÐ°Ð½Ñ ÑгноÑÑÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ¸. - ÐапÑикÑнÑÑ
100msâ Ñе одинupdateвÑдбÑваÑÑÑÑÑ Ð· оÑÑаннÑми кооÑдинаÑами. - ТодÑ, наÑеÑÑÑ, миÑа зÑпинÑÑÑÑÑÑ Ð´ÐµÑÑ. ÐекоÑований ваÑÑÐ°Ð½Ñ ÑекаÑ, доки мине
100ms, а поÑÑм запÑÑкаÑupdateз оÑÑаннÑми кооÑдинаÑами. ÐÑже, дÑже важливо, Ñоб оÑÑаÑоÑÐ½Ñ ÐºÐ¾Ð¾ÑдинаÑи миÑÑ Ð¾Ð±ÑобилиÑÑ.
ÐÑиклад кодÑ:
function f(a) {
console.log(a);
}
// f1000 пеÑÐµÐ´Ð°Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ¸ до f макÑимÑм один Ñаз на 1000 мÑ
let f1000 = throttle(f, 1000);
f1000(1); // показÑÑ 1
f1000(2); // (обмеженнÑ, 1000 Ð¼Ñ Ñе не закÑнÑилиÑÑ)
f1000(3); // (обмеженнÑ, 1000 Ð¼Ñ Ñе не закÑнÑилиÑÑ)
// коли 1000 ms time out ...
// ...виводиÑÑ 3; пÑомÑжне знаÑÐµÐ½Ð½Ñ 2 бÑло пÑоÑгноÑовано
P.S. ÐÑгÑменÑи Ñа конÑекÑÑ this пеÑÐµÐ´Ð°Ð½Ñ Ð² f1000 Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð±ÑÑи пеÑÐµÐ´Ð°Ð½Ñ Ð¾ÑигÑналÑнÑй f.
function throttle(func, ms) {
let isThrottled = false,
savedArgs,
savedThis;
function wrapper() {
if (isThrottled) { // (2)
savedArgs = arguments;
savedThis = this;
return;
}
isThrottled = true;
func.apply(this, arguments); // (1)
setTimeout(function() {
isThrottled = false; // (3)
if (savedArgs) {
wrapper.apply(savedThis, savedArgs);
savedArgs = savedThis = null;
}
}, ms);
}
return wrapper;
}
Ðиклик throttle(func, ms) повеÑÑÐ°Ñ wrapper.
- ÐÑд ÑÐ°Ñ Ð¿ÐµÑÑого викликÑ
wrapperпÑоÑÑо викликаÑfuncÑ Ð²ÑÑановлÑÑ ÑÑан вÑдпоÑÐ¸Ð½ÐºÑ (isThrottled = true). - ÐÑд ÑÐ°Ñ ÑÑого ÑÑÐ°Ð½Ñ Ð²ÑÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ¸ запамâÑÑовÑÑÑÑÑÑ Ð²
savedArgs/savedThis. ÐвеÑнÑÑÑ ÑвагÑ, Ñо Ñк конÑекÑÑ, Ñак Ñ Ð°ÑгÑменÑи однаково важливÑ, Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð±ÑÑи запамâÑÑованими. ÐÐ»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ повноÑÑнного викликÑ, нам поÑÑÑÐ±Ð½Ñ Ñ Ð°ÑгÑменÑ, Ñ ÐºÐ¾Ð½ÑекÑÑ Ð¾Ð´Ð½Ð¾ÑаÑно. - ÐÑÑÐ»Ñ Ñого, Ñк минаÑ
msмÑлÑÑекÑнд,setTimeoutÑпÑаÑÑовÑÑ. СÑан вÑдпоÑÐ¸Ð½ÐºÑ Ð·Ð½ÑмаÑÑÑÑÑ (isThrottled = false) Ñ, ÑкÑо ми мали пÑоÑгноÑÐ¾Ð²Ð°Ð½Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ¸,wrapperвиконÑÑÑÑÑÑ Ð· оÑÑаннÑми збеÑеженими аÑгÑменÑами Ñа конÑекÑÑом.
3-й кÑок запÑÑÐºÐ°Ñ Ð½Ðµ func, а wrapper, ÑÐ¾Ð¼Ñ Ñо ми не ÑÑлÑки Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾Ð½ÑваÑи func, але й Ñе Ñаз вводиÑи ÑÑан вÑдпоÑÐ¸Ð½ÐºÑ Ñа налаÑÑовÑваÑи Ñайм-аÑÑ, Ñоб поÑÑм Ð·Ð½Ð¾Ð²Ñ Ð²ÑдмÑниÑи ÑÑан вÑдпоÑинкÑ.
ÐÑдкÑиÑи ÑÑÑÐµÐ½Ð½Ñ Ñз ÑеÑÑами в пÑÑоÑниÑÑ.