节流:如果一个函数持续的频繁的触发,那么让他在一定的时间间隔后再触发。
感觉就像是过安检,人多的时候隔一段时间放进去几个。

消抖:如果一个函数持续的触发,那么只在它结束过一段时间只执行一次。
像是两个人的对话,A在不停的balabala,如果他说话有停顿,但是停顿的时间不够长,就认为他没有说完,当停顿的时间足够长才认为A说完了,然后B开始回答。
输入联想是消抖,当输入停顿时间足够长再去查询,如果连续输入(停顿时间短)就不去调接口。

消抖和节流都是某个行为持续的触发,不同之处在于是要优化到减少他的执行次数还是优化到只执行一次。

1
2
3

消抖<input onkeyup="keyupHandle(event)">
节流<input onkeyup="keyupHandle2(event)">
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// 消抖
function keyupHandle(e) {
debounceHandle(e.target.value)
}
// 节流
function keyupHandle2(e) {
throttleHandle(e.target.value)
}

// 模拟异步
function ajax(aa) {
setTimeout(()=>{
console.log('-----' + aa)
},500)
}
var debounceHandle = debounce(ajax, 1000) // 消抖 间隔时间不足1s就不会触发
var throttleHandle = throttle(ajax, 1000) // 节流 每隔1s触发一次


function debounce(fn, delay) {
let timer = null;

return function() {
let args = arguments
clearTimeout(timer);

timer = setTimeout(function() {
fn(args[0]);
}, delay);
}
}


function throttle(fn, delay) {
let args = arguments,
context = this,
timer = null,
remaining = 0,
previous = new Date();

return function(ttt) {
let now = new Date();
let args = arguments
remaining = now - previous;

if (remaining >= delay) {
if (timer) {
clearTimeout(timer);
}

fn.apply(context, args);
previous = now;
} else {
if (!timer) {
timer = setTimeout(function() {
fn.apply(context, args);
previous = new Date();
}, delay - remaining);
}
}
};
}