Throttle decorator
âã¹ããããªã³ã°â ãã³ã¬ã¼ã¿ throttle(f, ms) ãä½ãã¾ã â ããã¯ã©ããã¼ãè¿ããms ããªç§æ¯ã«æå¤§ä¸åº¦ f ã®å¼ã³åºããæ¸¡ãã¾ããâã¯ã¼ã«ãã¦ã³â æéã«å
¥ãå¼ã³åºãã¯ç¡è¦ããã¾ãã
debounce ã¨ã®éã㯠â ããç¡è¦ãããå¼ã³åºããã¯ã¼ã«ãã¦ã³ä¸ã®æå¾ã®ãã®ã§ããã°ãé
å»¶ã®çµããã«ãããå®è¡ãã¾ãã
å®éã®ã¢ããªã±ã¼ã·ã§ã³ã確èªãã¦ãè¦ä»¶ã®ããããçè§£ã¨ãããã©ãããæ¥ãã®ããè¦ã¦ã¿ã¾ãããã
ä¾ãã°ããã¦ã¹ã®åãã追跡ãããã¨æãã¾ãã
ãã©ã¦ã¶ã§ã¯ããã¦ã¹ã®ãã¤ã¯ãã¬ãã«ã®åãã«å¯¾ãã¦å®è¡ããã颿°ãè¨å®ããç§»åã«å¿ãããã¤ã³ã¿ã®å ´æãåå¾ããäºãã§ãã¾ãããã¦ã¹ä½¿ç¨ä¸ããã®é¢æ°ã¯é常ã¨ã¦ãé »ç¹ã«å®è¡ããã1ç§ããã100å(10ããªç§æ¯)ç¨åº¦ã«ãªãã¾ãã
ãã®è¿½è·¡é¢æ°ã¯ web ãã¼ã¸ä¸ã®ä¸é¨ã®æ å ±ãæ´æ°ããå¿ è¦ãããã¾ãã
æ´æ°ãè¡ã颿° update() ã¯ãã¤ã¯ãã¬ãã«ã®ç§»åã§å®è¡ããã«ã¯éããã¾ããã¾ãã100ms ã«1åããå¤ãã®é »åº¦ã§å®è¡ãã¦ãæå³ãããã¾ããã
å¾ã£ã¦ããªãªã¸ãã«ã® update() ã®ä»£ããã«ãã¦ã¹ç§»åæ¯ã«å®è¡ãã颿°ã¨ã㦠throttle(update, 100) ãå²ãå½ã¦ã¾ãããã®ãã³ã¬ã¼ã¿ã¯é »ç¹ã«å¼ã°ãã¦ããupdate() ãå¼ã°ããã®ã¯ 100ms æ¯ã«æå¤§ä¸åã§ãã
è¦è¦çã«ã次ã®ããã«ãªãã¾ã:
- æåã®ãã¦ã¹ã®ç§»åã«å¯¾ãã¦ããã³ã¬ã¼ããããããªã¢ã³ãã¯
updateã¸å¼ã³åºããæ¸¡ãã¾ããããã¯éè¦ã§ãã¦ã¼ã¶ã¯èªèº«ã®ç§»åã«å¯¾ãããªã¢ã¯ã·ã§ã³ãããã«è¦ãã¾ãã - ãã®å¾ããã¦ã¹ãç§»åããã®ã«å¯¾ã
100msã¾ã§ä½ãèµ·ããã¾ããããã³ã¬ã¼ã¿ã¯å¼ã³åºããç¡è¦ãã¾ãã 100msãçµéããã¨ â æå¾ã®åº§æ¨ã§ããä¸åº¦updateãçºçãã¾ãã- ããã¦æçµçã«ããã¦ã¹ã¯ã©ããã§åæ¢ãã¾ãããã³ã¬ã¼ããããããªã¢ã³ãã¯
100msã®æéã¾ã§å¾ ã¡ããã®å¾æå¾ã®åº§æ¨ã§updateãå®è¡ãã¾ããå¾ã£ã¦ãæããæãéè¦ãªæå¾ã®ãã¦ã¹åº§æ¨ã¯å¦çããã¾ãã
ã³ã¼ãä¾:
function f(a) {
console.log(a)
};
// f1000 ã¯ã1000ms æ¯ã«æå¤§1å f ã¸å¼ã³åºããæ¸¡ãã¾ã
let f1000 = throttle(f, 1000);
f1000(1); // shows 1
f1000(2); // (throttling, 1000ms not out yet)
f1000(3); // (throttling, 1000ms not out yet)
// when 1000 ms time out...
// ...outputs 3, intermediate value 2 was ignored
P.S. f1000 ã«æ¸¡ããã弿°ã¨ã³ã³ããã¹ã this ã¯ãªãªã¸ãã«ã® f ã«æ¸¡ãããå¿
è¦ãããã¾ãã
function throttle(func, ms) {
let isThrottled = false,
savedArgs,
savedThis;
function wrapper() {
if (isThrottled) { // (2)
savedArgs = arguments;
savedThis = this;
return;
}
func.apply(this, arguments); // (1)
isThrottled = true;
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 ãå®è¡ããã ãã§ã¯ãªããåã³ã¯ã¼ã«ãã¦ã³ç¶æ
ã«å
¥ããããããªã»ããããããã®ã¿ã¤ã ã¢ã¦ããè¨å®ããå¿
è¦ãããããã§ãã
function throttle(func, ms) {
let isThrottled = false,
savedArgs,
savedThis;
function wrapper() {
if (isThrottled) {
// memo last arguments to call after the cooldown
savedArgs = arguments;
savedThis = this;
return;
}
// otherwise go to cooldown state
func.apply(this, arguments);
isThrottled = true;
// plan to reset isThrottled after the delay
setTimeout(function() {
isThrottled = false;
if (savedArgs) {
// if there were calls, savedThis/savedArgs have the last one
// recursive call runs the function and sets cooldown again
wrapper.apply(savedThis, savedArgs);
savedArgs = savedThis = null;
}
}, ms);
}
return wrapper;
}
ãµã³ãããã¯ã¹ã§ãã¹ãã¨ä¸ç·ã«è§£çãéã