实现思路:利用定时器在第一次触发函数时打一个开关,表明我已经进入了倒计时,在指定的时间后会触发,可是你在这个指定的时间以前都经过判断这个开关是打开状态就没法再次触发函数,等到倒计时结束开关关闭,下次执行就能够再次进行倒计时操做。也就实现了约定必定的时间执行一次函数的操做。javascript
简单代码实现:java
function throttle(fn, delay = 500) {
let canRun = true;
return function() {
// 这里实际上是使用了闭包的原理,函数内部保存使用了函数外部的变量。
if(!canRun) return;
canRun = false;
setTimeout(() => {
fn.apply(this, arguments);
canRun = true;
}, delay)
}
}
复制代码
实现思路:仍是一样须要利用定时器,当咱们执行这个函数时,会生成一个定时器,可是若是你重复执行这个函数,每次执行函数的第一步是清除上一次的定时器,这样就能够达成只有触发操做后超过指定的间隔说明这一次触发才有效,不然就要从新计时等待。闭包
简单代码实现:app
function debounce(fn, delay = 500) {
let timeout = null;
return function() {
clearTimeout(timeout);
timeout = setTimeout(() => {
fn.apply(this, arguments);
}, delay)
}
}
复制代码
// 案例一:这里使用了装饰器包装了loadsh中的debounce
@Debounce(300)
onSearch(name) {
this.props.dispatch({type: 'sysUser/queryOrgUser', payload: {
body: {
name,
role: USERROLE_TYPE.ACCOUNT_MANAGEMENT,
}
}});
}
// 案例二:这里直接用的loadsh的debounce包装了咱们方法
const debounceCalculate = debounce(this.trialTranslateMoney, 500);
if(value <= num) {
debounceCalculate({
investAmt: value
})
}else {
this.money = num;
}
复制代码