throttle

Django:RestFramework之-------频率控制

穿精又带淫゛_ 提交于 2019-12-04 08:52:34
5.频率控制 5.1频率监控代码实现 import time VISIT_RECORD = {} class VisitThrottle(object): def __init__(self): #定义历史记录,生产环境上,应该将其保存在redis self.history = [] def allow_request(self,request,view): #1.获取用户IP remote_addr = request._request.META.get("REMOTE_ADDR") print(remote_addr) #记录访问时的时间 ctime = time.time() #判断当前IP是否在访问记录中 if remote_addr not in VISIT_RECORD: VISIT_RECORD[remote_addr] = [ctime,] return True #拿取当前访问IP记录 history = VISIT_RECORD.get(remote_addr) #将历史访问时间记录,复制给self.history,以方便wait方法调用,通过wait方法告诉用户一些信息 self.history = history #逻辑判断只记录1分钟内访问记录。 while history and history[-1] < ctime-60: history.pop()

函数节流和函数防抖

放肆的年华 提交于 2019-12-04 04:38:02
函数节流与函数防抖是我们解决频繁触发DOM事件的两种常用解决方案,但是经常傻傻分不清楚。本章内容对两者区别展开描述: 首先思考三个问题:   1. 函数节流和函数防抖是什么东东?   2. 为什么要使用函数节流和函数防抖?   3. 如何实现 函数节流和函数防抖 ? 基本思想: 某些代码不可以在没有间断的情况连续重复执行。 使用原因:DOM操作 比起非DOM交互,需要更多的 内存 和 CPU时间 ,连续尝试过多的DOM操作可能会导致浏览器挂起,甚至崩溃。 应用场景: 只要代码是 周期执行 的,都应该节流。鼠标移动mousemove事件、滚动条滚动scroll事件,浏览器窗口改变resize事件等。 生活中物体对两者形象的描述:    函数节流( throttle ): 一个水龙头在滴水,可能一次性会滴很多滴,但是我们只希望它每隔 500ms 滴一滴水,保持这个频率。即我们希望函数在以一个可以接受的频率重复调用。    函数防抖( debounce ): 将一个弹簧按下,继续加压,继续按下,只会在最后放手的一瞬反弹。即我们希望函数只会调用一次,即使在这之前反复调用它,最终也只会调用一次而已。 两者比较:   由于节流在resize中是最常用的,所以我们基于该事件来改变页面布局进行两者的比较。   window.onresize = function() { var div =

防抖与节流函数<转>

你说的曾经没有我的故事 提交于 2019-12-04 02:32:23
本文转自: https://www.cnblogs.com/zhuanzhuanfe/p/10633019.html 我们经常会处理各种事件,比如常见的click、scroll、 resize等等。仔细一想,会发现像scroll、onchange这类事件会频繁触发,如果我们在回调中计算元素位置、做一些跟DOM相关的操作,引起浏览器回流和重绘,频繁触发回调,很可能会造成浏览器掉帧,甚至会使浏览器崩溃,影响用户体验。 还有以下场景往往由于事件频繁被触发,因而频繁执行DOM操作、资源加载等重行为,导致UI停顿甚至浏览器崩溃。 1. window对象的resize、scroll事件 2. 拖拽时的mousemove事件 3. 射击游戏中的mousedown、keydown事件 4. 文字输入、自动完成的keyup事件 实际上对于window的resize事件,实际需求大多为停止改变大小n毫秒后执行后续处理;而其他事件大多的需求是以一定的频率执行后续处理。 针对这两种需求,常用的解决方案:防抖和节流。 防抖(debounce) 所谓防抖,就是指触发事件后,就是把触发非常频繁的事件合并成一次去执行。即在指定时间内只执行一次回调函数,如果在指定的时间内又触发了该事件,则回调函数的执行时间会基于此刻重新开始计算。 以我们生活中乘车刷卡的情景举例,只要乘客不断地在刷卡,司机师傅就不能开车

JavaScript 高级系列之节流 [throttle] 与防抖 [debounce]

放肆的年华 提交于 2019-12-03 12:14:08
一、概念 这两个东西都是为了项目优化而出现的,官方是没有具体定义的,他们的出现主要是为了解决一些短时间内连续执行的事件带来性能上的不佳和内存的消耗巨大等问题; 像这类事件一般像 scroll keyup mousemove resize等等,短时间内不断的触发,在性能上消耗是非常大的,尤其是一些改变DOM结构的操作; 节流[throttle]与防抖[debounce]非常相似,都是让上述这类事件在规定的事件从不断的去触发更改成为规定的时间内触发多少次; 节流[throttle] 节流通俗来解释就比如我们水龙头放水,阀门一打开,水哗哗的往下流,这个秉着勤俭节约的优良传统美德,我们要把水龙头关小点,最好是如我们心意按照一定规律在某个时间间隔内一滴一滴的往下滴,这,,,好吧这就是我们节流的概念; 换成函数来说,使用setTimeout方法,给定两个时间,后面的时间减去前面的时间,到达我们给定的时间就去触发一次这个事件,这么说太笼统的,我们看下面的函数,这里我们以【scroll】为例; /** 样式我就顺便写了 **/ <style> *{padding:0;margin:0;} .scroll-box{ width : 100%; height : 500px; background:blue; overflow : auto; } .scroll-item{ height:1000px

laravel6.0路由

风流意气都作罢 提交于 2019-12-03 08:21:40
1.基本路由 路由定义在routes目录下,路由执行是在控制器之前, 路由路径 routes目录下 api.php 关于接口路由定义 文件包含的路由位于 api 中间件组约束之内,支持频率限制功能,这些路由是无状态的。所以请求通过这些 路由进入应用需要通过 token 进行认证并且不能访问 Session 状态。 channle.php 面板 文件用于注册应用支持的所有事件Broadcast。 console.php 控制台定义 文件用于定义所有基于闭包的控制台命令。每个闭包都被绑定到一个控制台命令并且允许与命令行IO方法进行 交互。尽管这个文件并不定义HTTP路由,但是它定义了基于控制台的应用入口 web.php 所有的网站请求路由 2.路由类型定义: Route::get("hello","HelloConroller@hello"); Route::post($uri, $callback); Route::put($uri, $callback); Route::patch($uri, $callback); Route::delete($uri, $callback); Route::options($uri, $callback); // 匹配 post 类型的请求方式 // 匹配 put 类型的请求方式 // 匹配 patch 类型的请求方式 // 匹配 delete

防抖与节流 & 若每个请求必须发送,如何平滑地获取最后一个接口返回的数据

泄露秘密 提交于 2019-12-03 07:22:44
博客地址: https://ainyi.com/79 日常浏览网页中,在进行窗口的 resize、scroll 或者重复点击某按钮发送请求,此时事件处理函数或者接口调用的频率若无限制,则会加重浏览器的负担,界面可能显示有误,服务端也可能出问题,导致用户体验非常糟糕 此时可以采用 debounce(防抖)和 throttle(节流)的方式来减少事件或接口的调用频率,同时又能实现预期效果 防抖 :将几次操作合并为一此操作进行。原理是维护一个计时器,规定在 delay 时间后触发函数,但是在 delay 时间内再次触发的话,就会取消之前的计时器而重新设置。这样一来,只有最后一次操作能被触发 节流 :使得一定时间内只触发一次函数。原理是通过判断是否到达一定时间来触发函数 区别 : 函数节流不管事件触发有多频繁,都会保证在规定时间内一定会执行一次真正的事件处理函数,而函数防抖只是在连续触发的事件后才触发最后一次事件的函数 上面的解释,摘抄网上的解答 防抖 debounce:当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,又一次触发了事件,就重新开始延时 如下图,持续触发 scroll 事件时,并不执行 handle 函数,当 1000ms 内没有触发 scroll 事件时,才会延时触发 scroll 事件 function debounce

JS的节流、函数防抖 原理及使用场景

我是研究僧i 提交于 2019-12-03 02:27:50
本文转载于: 猿2048 网站➪ https://www.mk2048.com/blog/blog.php?id=hh1bjbabaa 概念和例子 函数防抖(debounce) 在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。 看一个🌰(栗子): //模拟一段ajax请求 function ajax(content) { console.log('ajax request ' + content) } let inputa = document.getElementById('unDebounce') inputa.addEventListener('keyup', function (e) { ajax(e.target.value) }) 复制代码 看一下运行结果: 可以看到,我们只要按下键盘,就会触发这次ajax请求。不仅从资源上来说是很浪费的行为,而且实际应用中,用户也是输出完整的字符后,才会请求。下面我们优化一下: //模拟一段ajax请求 function ajax(content) { console.log('ajax request ' + content) } function debounce(fun, delay) { return function (args) { let that = this let _args = args

防抖和节流原理分析

白昼怎懂夜的黑 提交于 2019-12-02 23:41:43
本文转载于: 猿2048 网站➩ https://www.mk2048.com/blog/blog.php?id=ha02bcbhaa 窗口的resize、scroll、输入框内容校验等操作时,如果这些 操作处理函数 是较为复杂或页面频繁重渲染等操作时,在这种情况下如果事件触发的频率无限制,会加重浏览器的负担,导致用户体验非常糟糕。此时我们可以采用debounce(防抖)和throttle(节流)的方式来 减少触发的频率 ,同时又不影响实际效果。 eg:搜索框的请求优化,输入搜索词条需要立即触发搜索请求时,防抖和节流可以将多个请求合并为一个请求 github前端笔记传送门 ,走过路过 star 一个? 首先准备 html 文件中代码如下: <div id="content" style="height:150px;line-height:150px;text-align:center; color: #fff;background-color:#ccc;font-size:80px;"></div> <script> var num = 1; var content = document.getElementById('content'); function count() { content.innerHTML = num++; }; content.onmousemove =

详谈js防抖和节流

匿名 (未验证) 提交于 2019-12-02 23:03:14
本文由小芭乐发表 0. 引入 首先举一个例子: 模拟在输入框输入后做ajax查询请求,没有加入防抖和节流的效果,这里附上完整可执行代码: <! DOCTYPE html > < html lang = "en" > < head > < meta charset = "UTF-8" > < title >没有防抖</ title > < style type = "text/css" ></ style > < script type = "text/javascript" > window . onload = function () { //模拟ajax请求 function ajax ( content ) { console . log ( 'ajax request ' + content ) } let inputNormal = document . getElementById ( 'normal' ); inputNormal . addEventListener ( 'keyup' , function ( e ) { ajax ( e . target . value ) }) } </ script > </ head > < body > < div > 1. 没有防抖的输入: < input type = "text" name = "normal"

性能优化之throttle, debounce

匿名 (未验证) 提交于 2019-12-02 22:56:40
throttle节流的思想: 应用场景: 主要 Ӧ 这 种 Ӧ 用 场 景中 const throttle = (func, limit) => { let lastFunc let lastRan return function() { const context = this const args = arguments if (!lastRan) { func.apply(context, args) lastRan = Date.now() } else { clearTimeout(lastFunc) lastFunc = setTimeout(function() { if ((Date.now() - lastRan) >= limit) { func.apply(context, args) lastRan = Date.now() } }, limit-(Date.now() - lastRa)) } } } debounce:防抖的思想: const debounce = (fn,delay)=>{ let timer ; delay = delay || 200 return function(){ let ctx = this let args = arguments if(timer) clearTimeout(timer) timer =