實現思路:利用定時器在第一次觸發函數時打一個開關,表明我已經進入了倒計時,在指定的時間後會觸發,可是你在這個指定的時間以前都經過判斷這個開關是打開狀態就沒法再次觸發函數,等到倒計時結束開關關閉,下次執行就能夠再次進行倒計時操做。也就實現了約定必定的時間執行一次函數的操做。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;
}
複製代碼