serendipityApe / javascriptPromotion

资深前端必备的编码问题
3 stars 0 forks source link

可控制的防抖 #8

Open serendipityApe opened 2 years ago

serendipityApe commented 2 years ago

题目 implement debounce() with leading & trailing option 基于上一个问题防抖

例子

一个input输入框,一直触发其输入事件。(下文---代表一直触发输入事件)
当{leading: true,trailing: true}   //开始输入(执行func)---- 停止输入(wait后执行func) 开始输入(执行func)----停止输入(wait后执行func)
当{leading: false,trailing: true}   //开始输入---- 停止输入(wait后执行func) 开始输入----停止输入(wait后执行func)
当{leading: true,trailing: false}   //开始输入(执行func)---- 停止输入  开始输入(执行func)----停止输入
当{leading: false,trailing: false}   //开始输入---- 停止输入  开始输入----停止输入
ps:当{leading: true,trailing: true} ,且只输入一个字符,结果为 //开始输入(执行func) 而不是 //开始输入(执行func)(wait后执行func)

答案

//以输入事件为例
//规定 一个轮询为:在wait间隔内一直触发输入 即:开始输入---- 停止输入   (快速输入一个字符串)    
//规定 输入事件 为:输入一个字符触发的事件 即 开始输入---- 停止输入中的-   (输入单个字符)
function debounce(func,wait,option ={leading:false,trailing:true}){
let timer=null;
return function(){
let isInvoked=false;
//没有定时器(本次轮询开始)且leading为true
if(timer == null && option.leading){
func.apply(this,arguments);
isInvoked=true;
}
clearTimeout(timer);
timer=setTimeout(() => {
//本次输入事件开始时未执行过func且trailing为true
if(option.trailing && !isInvoked){
func.apply(this,arguments);
}
timer=null;
}, wait);
}
}