博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
throttle debounce 总结
阅读量:6157 次
发布时间:2019-06-21

本文共 2085 字,大约阅读时间需要 6 分钟。

理解throttle debounce

  • 比较

二者本质:都是限制频繁触发

二者区别:
throttle: 节流阀,保证多少ms内只执行一次。
debounce: 去抖,保证多少ms内不再被触发时就会执行一次。

  • 类比电梯策略理解:

throttle:第一个人进来后15s运送一次,不等待。

debounde:第一个人进来15s后运送一次,假设15s内又有人进来,重新计时,一直到15s内不再有人进来则运送一次

  • 一秒理解 throttle debounce:   

throttle debounce 实现

以throttle-debounce 包代码解析:

debounce.js:

var throttle = require('./throttle');module.exports = function ( delay, atBegin, callback ) {    return callback === undefined ? throttle(delay, atBegin, false) : throttle(delay, callback, atBegin !== false);};

throttle.js:

module.exports = function ( delay, noTrailing, callback, debounceMode ) {    var timeoutID;    // Keep track of the last time `callback` was executed.    var lastExec = 0;    if ( typeof noTrailing !== 'boolean' ) {        debounceMode = callback;        callback = noTrailing;        noTrailing = undefined;    }    function wrapper () {        var self = this;        var elapsed = Number(new Date()) - lastExec;        var args = arguments;        // Execute `callback` and update the `lastExec` timestamp.        function exec () {            lastExec = Number(new Date());            callback.apply(self, args);        }        function clear () {            timeoutID = undefined;        }        if ( debounceMode && !timeoutID ) {            exec();        }        if ( timeoutID ) {            clearTimeout(timeoutID);        }        if ( debounceMode === undefined && elapsed > delay ) {             // throttle时,根据时间戳之差是否大于delay决定是否执行回调                      exec();        } else if ( noTrailing !== true ) {            // debounce时,setTimeout延迟执行回调            timeoutID = setTimeout(debounceMode ? clear : exec, debounceMode === undefined ? delay - elapsed : delay);        }    }    return wrapper;};

应用

shop.js: // 输入关键字查询门店

import { throttle, debounce } from 'throttle-debounce';...debounce(200, async(val) => { await this.getShopList(val); });...

还可以参考underscore, lodash 中throttle, debounce的实现,做了更多的兼容和考虑。

throttle debounce 应用场景

throttle:

监听resize事件做一些DOM元素的定位更改;
监听scroll 事件判断上拉时是否要加载数据
debounce:
搜索框输入发送ajax请求,监听onchange or keyup 事件进行查询;

Reference

1. 

2.

转载地址:http://hssfa.baihongyu.com/

你可能感兴趣的文章
怎样成为一个高手观后感
查看>>
[转]VC预处理指令与宏定义的妙用
查看>>
MySql操作
查看>>
python 解析 XML文件
查看>>
MySQL 文件导入出错
查看>>
java相关
查看>>
由一个异常开始思考springmvc参数解析
查看>>
向上扩展型SSD 将可满足向外扩展需求
查看>>
虚机不能启动的特例思考
查看>>
SQL Server编程系列(1):SMO介绍
查看>>
在VMware网络测试“专用VLAN”功能
查看>>
使用Formik轻松开发更高质量的React表单(三)<Formik />解析
查看>>
也问腾讯:你把用户放在什么位置?
查看>>
CSS Sprites 样式生成工具(bg2css)
查看>>
[转]如何重构代码--重构计划
查看>>
类中如何对list泛型做访问器??
查看>>
C++解析XML--使用CMarkup类解析XML
查看>>
P2P应用层组播
查看>>
Sharepoint学习笔记—修改SharePoint的Timeouts (Execution Timeout)
查看>>
CSS引入的方式有哪些? link和@import的区别?
查看>>