美文网首页
throttle和debounce

throttle和debounce

作者: 南慕瑶 | 来源:发表于2020-04-28 11:51 被阅读0次

一、作用

【throttle】

保证响应函数,在一定时间内,最多只触发一次。

在这“一定时间”内,响应第一次触发动作。

【debounce】

保证响应函数,在连续的动作结束后,再触发。

仅仅响应最后一次触发动作。

二、实现

【注:描述说明】

action 是连续动作期望触发的响应函数。如:连续 onClick 期望触发的 clickHandler。

响应,即执行 action 函数。

触发动作,即类似 click 的用户连续操作。

【throttle】

var throttle = function(delay, action){

    var last = 0;

    return function(){

        var curr = +new Date();

        if(curr - last > delay){

            action.apply(this, arguments);

            last = curr;            

        }

    }

}

在上一次响应触发动作后的 delay 毫秒内,不再响应。

上一次响应超过 delay 毫秒后,再有触发动作发出,正常响应,并重新倒计时 delay 毫秒,期间不再响应。

【适用场景】

比如 H5 列表页的上拉加载,假如我们判断,onScroll 时,滑动元素距离达到底部剩余距离小于50px,发出请求下一页数据的请求。

如果不使用 throttle,小于 50px 开始,由于用户在持续做 scroll 动作,会连续发送 n 条请求。

使用 throttle 逻辑处理,确保刚刚到达 50px 距离时,发出拉取下一页的请求。请求后,delay 毫秒内,不再重复发出拉取请求。

【debounce】

var debounce = function(idle, action){

    var timer;

    return function(){

        var ctx = this,

              args = arguments;

        clearTimeout(timer);

        timer = setTimeout(function(){

            action.apply(ctx, args);

        },idle);

    }

}

在连续的触发动作停止后,等待 idle 毫秒,再执行响应。

如果连续的触发动作不停止,则一直不执行响应。

【适用场景】

比如列表页翻页,快速、连续点击1、2、3、4页,防止连续4次响应click,使用 debounce 逻辑处理,确保只执行第4页的翻页请求。

三、使用

使用 throttle/debounce 包装响应函数 action 后,使用 throttleAction/debounceAction:

var throttleAction = throttle(1000, action);

var debounceAction = debounce(1000, action);

作为 click 等动作的响应函数即可。

相关文章

网友评论

      本文标题:throttle和debounce

      本文链接:https://www.haomeiwen.com/subject/gyhvwhtx.html