zoukankan      html  css  js  c++  java
  • underscore.js中的节流函数debounce及trottle

    函数节流   throttle and debounce的相关总结及想法

    一开始函数节流的使用场景是:放止一个按钮多次点击多次触发一个功能函数,所以做了一个clearTimeout setTimeout函数

    clearTimeout(cancelTimer);
    cancelTimer =setTimeout(function(){
        switchControl.switchAciontFactory(view, conf);
    },300)

    代码的意思就不做多说了,实际上我无意间实现了一个debounce

    在underscore.js中对于节流函数有两种定义

    trottle:若定义初始间隔100ms,多次触发事件只会触发初始的那一次,事件会与第一次触发的100ms后调起

    debounce:对于间隔时间内100ms内发生的调起事件,会不断重置setTimeout的时间

    下面来一段trorrle的源码
    _.throttle = function(func, wait, options) {
      var context, args, result;
      var timeout = null;
      // 上次执行时间点
      var previous = 0;
      if (!options) options = {};
      // 延迟执行函数
      var later = function() {
        // 若设定了开始边界不执行选项,上次执行时间始终为0
        previous = options.leading === false ? 0 : _.now();
        timeout = null;
        result = func.apply(context, args);
        if (!timeout) context = args = null;
      };
      return function() {
        var now = _.now();
        // 首次执行时,如果设定了开始边界不执行选项,将上次执行时间设定为当前时间。
        if (!previous && options.leading === false) previous = now;
        // 延迟执行时间间隔
        var remaining = wait - (now - previous);
        context = this;
        args = arguments;
        // 延迟时间间隔remaining小于等于0,表示上次执行至此所间隔时间已经超过一个时间窗口
        // remaining大于时间窗口wait,表示客户端系统时间被调整过
        if (remaining <= 0 || remaining > wait) {
          clearTimeout(timeout);
          timeout = null;
          previous = now;
          result = func.apply(context, args);
          if (!timeout) context = args = null;
        //如果延迟执行不存在,且没有设定结尾边界不执行选项
        } else if (!timeout && options.trailing !== false) {
          timeout = setTimeout(later, remaining);
        }
        return result;
      };
    };
     

    它实际上是通过一个计算,每次触发这个函数的时候获取当前时间,通过与上次存取的时间作对比,计算差值,动态设置setimeout的值,但实际个人觉得做一个阻断log就ok

    function throttle(fuc,wait){
            if(typeof(changeLog) == 'undefined'){
                setTimeout(fuc,wait)
                window.changeLog = true
            }
    }

    当然弊端不言而喻,全局声明的变量污染

    再去观看debounce的源码,相同的做法但是很奇怪的是,他没有果断重置setTimeout的时间,而是通过时间差值的加减,反正没看出有什么好处。。。

  • 相关阅读:
    python sendmail
    linux find命令
    10块钱去买酒,2块一瓶,2空瓶换一瓶,4盖换一瓶,问能喝到什么时候
    【转】通过经纬度坐标计算距离的方法(经纬度距离计算)
    Android应用开发相关下载资源(2015/3/20更新)
    使用Entity Framework访问MySQL数据库
    VS2013+EF6.1+Mysql配置心路历程
    SQL-LINQ-Lambda语法对照实例
    百度统计今晚更新了,统计的数据报表格式都大变样了,少不了我的功劳吧!跟类似yoyooho.com的小伙伴说再见啦
    跟踪那些像www.yoyooho.com非友链带来的百度统计数据解析【第三篇】
  • 原文地址:https://www.cnblogs.com/natureless/p/6270707.html
Copyright © 2011-2022 走看看