異步回調(diào)
有時候我們在需要執(zhí)行一個任務時,需要等它執(zhí)行完畢之后在執(zhí)行后面的同步任務,用定時器就很難控制,這個時候就需要寫一個回調(diào)函數(shù)
function f1(callback){
setTimeout(function(){
//做某件事,可能很久
console.log('別急,開始執(zhí)行f1')
for(var i=0;i< 100000;i++){
}
console.log('f1執(zhí)行完了')
callback()
}, 0);
}
function f2(){
console.log('執(zhí)行f2');
}
function f3(){
console.log('執(zhí)行f3');
}
f1(f2) //當f1執(zhí)行完之后再執(zhí)行 f2
f3()
函數(shù)節(jié)流(throttle)
事件的觸發(fā)權(quán)很多時候都屬于用戶,有些情況下會產(chǎn)生問題:
- 向后臺發(fā)送數(shù)據(jù),用戶頻繁觸發(fā),對服務器造成壓力
- 一些瀏覽器事件:window.onresize、window.mousemove等,觸發(fā)的頻率非常高,會造成瀏覽器性能問題
如果你碰到這些問題,那就需要用到函數(shù)節(jié)流和防抖了。
**函數(shù)節(jié)流:一個需要頻繁觸發(fā)的函數(shù),在規(guī)定時間內(nèi),只讓最后一次生效,前面的不生效。
1.如何實現(xiàn)
其原理就第一次調(diào)用函數(shù),創(chuàng)建一個定時器,在指定的時間間隔之后運行代碼。當?shù)诙握{(diào)用該函數(shù)時,它會清除前一次的定時器并設置另一個。如果前一個定時器已經(jīng)執(zhí)行過了,這個操作就沒有任何意義。然而,如果前一個定時器尚未執(zhí)行,其實就是將其替換為一個新的定時器,然后延遲一定時間再執(zhí)行。
var timer;
function hiFrequency(){
if(timer){
clearTimeout(timer);
}
timer = setTimeout(function(){
console.log('do something')
}, 300);
}
hiFrequency()
hiFrequency()
hiFrequency()
當調(diào)用hiFrequency()的時候,會進行一個判斷,剛開始的時候變量timer為undefind的時候,就會執(zhí)行定時器,在300毫秒輸出console.log('do something')。
當用戶在300毫秒之內(nèi),又調(diào)用hiFrequency()的時候,判斷條件為有值的時候,會執(zhí)行clearTimeout(timer),清除上一次的未執(zhí)行的定時器,重新開始計時,永遠只執(zhí)行最后一次!
可以進行改寫一下
function throttle(fn, delay) {
var timer = null
return function(){
clearTimeout(timer)
timer = setTimeout(function(){
fn(arguments)
}, delay)
}
}
function fn(){
console.log('hello ')
}
var fn2 = throttle(fn, 1000)
fn2()
fn2()
fn2()
和上面的是一樣的