throttle

函数防抖和函数节流

浪子不回头ぞ 提交于 2019-11-28 07:27:31
概念  函数防抖(debounce) 函数防抖,就是指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。   简单的说,当一个动作连续触发,则只执行最后一次。   打个比方,坐公交,司机需要等最后一个人进入才能关门。每次进入一个人,司机就会多等待几秒再关门。  函数节流(throttle) 限制一个函数在一定时间内只能执行一次。   举个例子,乘坐地铁,过闸机时,每个人进入后3秒后门关闭,等待下一个人进入。 函数防抖的应用场景  连续的事件,只需触发一次回调的场景有: 搜索框搜索输入。只需用户最后一次输入完,再发送请求 手机号、邮箱验证输入检测 窗口大小Resize。只需窗口调整完成后,计算窗口大小。防止重复渲染。 函数节流的应用场景  间隔一段时间执行一次回调的场景有: 滚动加载,加载更多或滚到底部监听 谷歌搜索框,搜索联想功能 高频点击提交,表单重复提交 函数防抖(debounce) 函数防抖的简单实现: 1 const _.debounce = (func, wait) => { 2 let timer; 3 4 return () => { 5 clearTimeout(timer); 6 timer = setTimeout(func, wait); 7 }; 8 }; 函数防抖在执行目标方法时,会等待一段时间

节流工具函数封装

你离开我真会死。 提交于 2019-11-27 08:27:59
节流函数 throttle 用于 解决频繁操作问题 ,限制一定时间内点击不触发事件 文章目录 一、不同的实现方法 1、定时器 2、时间戳 二、最优方法 三、开始封装工具函数 1、utils文件夹封装 2、页面内调用 四、局部变量问题 五、回调函数无法传参问题 1、尝试不传入整个函数,而是传入`func()` 2、曲线救国,给工具函数传参数,而不是给回调函数传参数 一、不同的实现方法 1、定时器 缺点 首次也会被延迟 ,不会立即执行 // 使用setTimeout实现 function throttle ( fn , delay ) { let flag = false if ( ! flag ) { return function ( ) { let context = this , args = arguments flag = setTimeout ( ( ) => { fn . apply ( context , args ) flag = true } , delay ) } } } 2、时间戳 缺点 在不可操作时间段中,点击无效, 时间段结束不自动执行 ,要再点击一次 有时需求,频繁操作后, 要记住最后一次点击,并定时结束自动执行 // 比较两次时间戳的间隔 是否大于等于 指定的时间 来决定是否执行事件回调 function throttle ( fn , delay )

rest-framework:频率控制

不打扰是莪最后的温柔 提交于 2019-11-26 17:29:06
一 频率简介:   为了控制用户对某个url请求的频率,比如,一分钟以内,只能访问三次 二 自定义频率类,自定义频率规则: 自定义的逻辑 #(1)取出访问者ip # (2)判断当前ip不在访问字典里,添加进去,并且直接返回True,表示第一次访问,在字典里,继续往下走 # (3)循环判断当前ip的列表,有值,并且当前时间减去列表的最后一个时间大于60s,把这种数据pop掉,这样列表中只有60s以内的访问时间, # (4)判断,当列表小于3,说明一分钟以内访问不足三次,把当前时间插入到列表第一个位置,返回True,顺利通过 # (5)当大于等于3,说明一分钟内访问超过三次,返回False验证失败 代码的实现,views.py代码 from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.throttling import SimpleRateThrottle,BaseThrottle #第一步,写一个频率类,继承SimpleRateThrottle #重写get_cache_key,返回self.get_ident(request) #一定要记住配置一个scop=字符串 # 第二步:在setting中配置 # REST