é²æè£ é¥°å¨
debounce(f, ms) è£
饰å¨çç»ææ¯ä¸ä¸ªå
è£
å¨ï¼è¯¥å
è£
å¨å°æå对 f çè°ç¨ï¼ç´å°ç»è¿ ms 毫ç§çéæ´»å¨ç¶æï¼æ²¡æå½æ°è°ç¨ï¼âå·å´æâï¼ï¼ç¶åä½¿ç¨ææ°çåæ°è°ç¨ f 䏿¬¡ã
æ¢å¥è¯è¯´ï¼debounce å°±åä¸ä¸ªâæ¥å¬çµè¯âçç§ä¹¦ï¼å¹¶ä¸ç´çå° ms 毫ç§çå®éæ¶é´ä¹åï¼æå°ææ°çå¼å«ä¿¡æ¯ä¼ è¾¾ç»âèæ¿âï¼è°ç¨å®é
ç fï¼ã
举个ä¾åï¼æä»¬æä¸ä¸ªå½æ° fï¼å¹¶å°å
¶æ¿æ¢ä¸º f = debounce(f, 1000)ã
ç¶åï¼å¦æå
è£
彿°åå«å¨ 0msã200ms å 500ms æ¶è¢«è°ç¨äºï¼ä¹å没æå
¶ä»è°ç¨ï¼é£ä¹å®é
ç f åªä¼å¨ 1500ms æ¶è¢«è°ç¨ä¸æ¬¡ãä¹å°±æ¯è¯´ï¼ä»æå䏿¬¡è°ç¨å¼å§ç»è¿ 1000ms çå·å´æä¹åã
â¦â¦å¹¶ä¸ï¼å®å°è·å¾æåä¸ä¸ªè°ç¨çææåæ°ï¼å ¶ä»è°ç¨çåæ°å°è¢«å¿½ç¥ã
以䏿¯å ¶å®ç°ä»£ç ï¼ä½¿ç¨äº Lodash library ä¸çé²æè£ é¥°å¨ ):
let f = _.debounce(alert, 1000);
f("a");
setTimeout( () => f("b"), 200);
setTimeout( () => f("c"), 500);
// 鲿彿°ä»æå䏿¬¡å½æ°è°ç¨ä»¥åçå¾
1000msï¼ç¶åæ§è¡ï¼alert("c")
ç°å¨æä»¬ä¸¾ä¸ä¸ªå®é ä¸çä¾åãåè®¾ç¨æ·è¾å ¥äºä¸äºå å®¹ï¼æä»¬æ³è¦å¨ç¨æ·è¾å ¥å®ææ¶åæå¡å¨åéä¸ä¸ªè¯·æ±ã
æä»¬æ²¡æå¿ è¦ä¸ºæ¯ä¸ä¸ªå符çè¾å ¥é½åé请æ±ãç¸åï¼æä»¬æ³è¦ç䏿®µæ¶é´ï¼ç¶åå¤çæ´ä¸ªç»æã
å¨ Web æµè§å¨ä¸ï¼æä»¬å¯ä»¥è®¾ç½®ä¸ä¸ªäºä»¶å¤çç¨åº ââ ä¸ä¸ªå¨æ¯æ¬¡è¾å
¥å
容åçæ¹å¨æ¶é½ä¼è°ç¨ç彿°ãé常ï¼ç嬿ææé®è¾å
¥çäºä»¶çå¤çç¨åºä¼è¢«è°ç¨çé常é¢ç¹ãä½å¦ææä»¬ä¸ºè¿ä¸ªå¤çç¨åºåä¸ä¸ª 1000ms ç debounce å¤çï¼å®ä»
ä¼å¨æå䏿¬¡è¾å
¥åç 1000ms å被è°ç¨ä¸æ¬¡ã
å¨è¿ä¸ªå®æ¶æ¼ç¤ºç示ä¾ä¸ï¼å¤çç¨åºå°ç»ææ¾ç¤ºå¨äºä¸é¢çæ¹æ¡ä¸ï¼è¯è¯çï¼
çå°äºåï¼ç¬¬äºä¸ªè¾å ¥æ¡è°ç¨äºé²æå½æ°ï¼æä»¥å®çå 容æ¯å¨æå䏿¬¡è¾å ¥ç 1000ms å被å¤ççã
å æ¤ï¼debounce æ¯ä¸ä¸ªå¤çä¸ç³»åäºä»¶çå¥½æ¹æ³ï¼æ 论æ¯ç³»åé®çè¾å
¥ï¼é¼ æ ç§»å¨è¿æ¯å
¶ä»ç±»ä¼¼çäºä»¶ã
å®å¨æå䏿¬¡è°ç¨ä¹åçå¾ ç»å®çæ¶é´ï¼ç¶åè¿è¡å ¶å¯ä»¥å¤çç»æç彿°ã
任塿¯å®ç°ä¸ä¸ª debounce è£
饰å¨ã
æç¤ºï¼å¦æä½ å¥½å¥½æ³æ³ï¼å®ç°å®åªéè¦å è¡ä»£ç :)
function debounce(func, ms) {
let timeout;
return function() {
clearTimeout(timeout);
timeout = setTimeout(() => func.apply(this, arguments), ms);
};
}
è°ç¨ debounce ä¼è¿åä¸ä¸ªå
è£
å¨ãå½å®è¢«è°ç¨æ¶ï¼å®ä¼å®æä¸ä¸ªå¨ç»å®ç ms ä¹å对åå§å½æ°çè°ç¨ï¼å¹¶åæ¶ä¹åçæ¤ç±»è¶
æ¶ã
