木雷双雄7 2020-10-30 17:15 采纳率: 0%
浏览 26

节流里面有异步请求时,节流失效啦?

1、节流里面有异步请求时,节流失效啦?没有异步请求可以正常节流!
2、具体代码如下:

export function throttle(func) {
    var timeout, context, args, result;
    var previous = 0;
    var wait = 4000;
    var options = {
        leading: true,
        trailing: false
    };

    var later = function() {
        previous = options.leading === false ? 0 : new Date().getTime();
        timeout = null;
        func.apply(context, args);
        if (!timeout) context = args = null;
    };

    var throttled = function() {
        var now = new Date().getTime();
        if (!previous && options.leading === false) previous = now;
        var remaining = wait - (now - previous);
        context = this;
        args = arguments;
        if (remaining <= 0 || remaining > wait) {
            if (timeout) {
                clearTimeout(timeout);
                timeout = null;
            }
            previous = now;
            func.apply(context, args);
            if (!timeout) context = args = null;
        } else if (!timeout && options.trailing !== false) {
            timeout = setTimeout(later, remaining);
        } 
    };

    throttled.cancel = function() {
        clearTimeout(timeout);
        previous = 0;
        timeout = null;
    };

    return throttled;
}
  • 写回答

1条回答 默认 最新

  • lshen01 2023-03-16 17:54
    关注

    参考GPT和自己的思路:

    对于这个问题,节流不能完全失效,但它的效果会受到异步请求的影响。具体来说,如果异步请求的时间超过了节流的等待时间,那么节流效果就会失去作用。其原因是当有异步请求时,代码执行的时间会比没有异步请求时长,从而导致在等待时间内可能已经有多个函数被调用,进而也就失去了节流的效果。

    针对这种情况,有几种应对方法。一种是在异步请求结束后重新计时,即重新设置 previous 和 timeout 变量,防止异步请求的时间影响到函数调用的时间。还有一种方法是使用 debounce 函数来代替 throttle,因为 debounce 在等待时间内有新的函数调用时可以取消之前的调用,保证只有最后一次函数调用生效,从而解决了异步请求带来的节流失效问题。

    评论

报告相同问题?

悬赏问题

  • ¥15 mmocr的训练错误,结果全为0
  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀