防抖(debounce)
所谓防抖,就是指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。
防抖函数分为非立即执行版和立即执行版。
非立即执行版:
function debounce(func, wait){
let timeout;
// 返回个函数,timeout还在内存中,并没有被收回
return function(){
let context = this;
let args = arguments;
if(timeout) clearTimeout(timeout);
timeout = setTimeout(()=>{
// 此处func的this指向windows,事件对象event为undefined,所以需要apply函数
func.apply(context, args);
}, wait);
}
}
立即执行版
function debounce(func, wait, immediatly){
let timeout;
// 返回个函数,timeout还在内存中,并没有被收回
return function(){
let context = this;
let args = arguments;
if (timeout) clearTimeout(timeout);// 这句是为了刷新timeout = null的时间,也就是在wait时间还没过就又触发了,那么timeout = null要再等wait时间。而timeout不等于null,是不会执行func.apply的。注:clearTimeout并不会使 !timeout 为true,timeout = null才会。
if(!timeout) func.apply(context, args);
timeout = setTimeout(()=>{
timeout = null;
}, wait);
}
}
/// flutter 立即版
/// Utils.debounce(_save).用法一 不带参数
/// Utils.debounce(()=>_save(context)).用法二 带参数
static Timertimer;
static Functiondebounce(Function func, {Duration wait =const Duration(seconds:3)}){
return (){
if (timer?.isActive ??false) {
timer?.cancel();
}
bool immediatly =timer ==null;
timer =Timer(wait, () =>timer =null);
if(immediatly) func?.call();
else debugPrint('防抖..》》》》》》》》》》》》》》》》》');
};
}
/// 防抖(非执行版)
/// Utils.debounce(_save).
/// Utils.debounce(()=>_save(context)).
static Functiondebounce2(Function func, {Duration wait =const Duration(seconds:3)}){
return (){
if (timer?.isActive ??false) {
timer?.cancel();
}
timer =Timer(wait, () {
func?.call();
});
};
}