惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Palo Alto Networks Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
C
CERT Recently Published Vulnerability Notes
C
Cybersecurity and Infrastructure Security Agency CISA
S
Schneier on Security
S
Securelist
酷 壳 – CoolShell
酷 壳 – CoolShell
C
CXSECURITY Database RSS Feed - CXSecurity.com
Cyberwarzone
Cyberwarzone
Apple Machine Learning Research
Apple Machine Learning Research
S
SegmentFault 最新的问题
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
GbyAI
GbyAI
Security Latest
Security Latest
Last Week in AI
Last Week in AI
Microsoft Security Blog
Microsoft Security Blog
云风的 BLOG
云风的 BLOG
Recorded Future
Recorded Future
Webroot Blog
Webroot Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
TaoSecurity Blog
TaoSecurity Blog
C
Cisco Blogs
博客园 - 【当耐特】
Blog — PlanetScale
Blog — PlanetScale
Hugging Face - Blog
Hugging Face - Blog
B
Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Attack and Defense Labs
Attack and Defense Labs
The Last Watchdog
The Last Watchdog
U
Unit 42
阮一峰的网络日志
阮一峰的网络日志
Project Zero
Project Zero
WordPress大学
WordPress大学
L
LINUX DO - 最新话题
F
Fortinet All Blogs
L
LINUX DO - 热门话题
PCI Perspectives
PCI Perspectives
Simon Willison's Weblog
Simon Willison's Weblog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
MongoDB | Blog
MongoDB | Blog
Latest news
Latest news
P
Proofpoint News Feed
T
Threat Research - Cisco Blogs
The Hacker News
The Hacker News
爱范儿
爱范儿
O
OpenAI News
J
Java Code Geeks
T
The Exploit Database - CXSecurity.com
H
Hackread – Cybersecurity News, Data Breaches, AI and More

Aimee's Blog

微服务与服务拆分:何时拆、怎么拆 异步与事件驱动架构:把协作从「打电话」改成「发消息」 高可用设计:怎么让系统尽量不宕机 可扩展性设计:怎么让系统加机器就能扛更多 缓存架构:多级缓存怎么搭 高并发三板斧:限流、熔断、降级 架构设计到底在设计什么 —— 从单体到微服务的演进 服务成本账:一个服务一个月烧多少钱 可观测性:线上出问题怎么查 API 设计:好接口长什么样 消息队列:为什么要 MQ,以及丢失、重复、顺序怎么破 查询优化:慢查询怎么治 —— 索引 + 预聚合 缓存:为什么快、三大坑、和数据库怎么保持一致 存储与基建选型 —— 传统业务 vs AI 大模型时代 权限系统怎么设计?—— 从 RBAC 到 Google Zanzibar 鉴权怎么落地?—— 常见业务场景的方案选型与避坑 JWT、OAuth、Token 刷新 —— 一个全栈工程师的鉴权入门笔记 我把跑了五年的旧博客升级到了 3.0 大模型 AIGC 满天飞 推荐一些学习和资料网站 2024 冒个泡 冒个泡 阿里云新机器安装 自定义配置 vue 的 webpack.config.js 从输入url到页面展示 React API 使用demo 欢迎加入 aimee前端技术交流群 github actions 自动化部署 很久以前的美食美荟 无穷之路纪录片还不错哦 vue 模板编译和组件化 vue2 响应式原理 vue2 虚拟DOM原理 vue2 源码解析-初始化 vue2.0 router及简易实现 Proxy 和 Object.defineProperty git rebase
防抖和节流
Aimee · 2021-10-26 · via Aimee's Blog

防抖

触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间。 每次触发事件时都取消之前的延时调用方法 ​

常见使用场景是:用户输入,只有在输入完之后才做校验 ​

示例: 滚动结束后才执行一次

function debounce(fun, wait, imediate){
	let timer = null
  return function(...rest){
    if(imediate&&!timer) {
    	fun.apply(this,rest)
    }
  	if(timer)clearTimeout(timer)
    timer = setTimeout(()=>{
      fun.apply(this,rest)
    }, wait)
  }
}
const fun = function(...rest){
  console.log(new Date().getTime())
}
window.addEventListener('scroll',debounce(fun,1000,false))

过程:

  • 设置一个外层函数,接受需要执行的函数、等待时间、是否立刻执行参数,定义一个变量timer共内层函数使用
  • 外层函数return 一个函数,该函数中通过外层变量timer记录定时器,在设置定时器之前先判断是否是立刻执行并且没有定时器存在,满足则直接调用需要执行的函数;再判断定时器是否存在,如果存在清除定时器,设置定时器,定时器的回调为需要执行的函数,时间参数为等待的时间参数

节流

高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率。 每次触发事件时都判断当前是否有等待执行的延时函数 ​

常见使用场景是页面滚动,或者鼠标移动,减少函数调用的频次。 ​

示例: 滚动开始后每间隔1000ms执行一次

// 时间戳版本 

function throttle(fun, time){
	let last = 0;
  return function(...rest){
  	let now = new Date().getTime();
    if(now-last>time){
    	last = now;
      fun.apply(this, rest)
    }
  }
}
// 定时器版本
function throttle2(fun, time){
	let timer = null
  return function(...rest){
  	if(timer)return
    timer = setTimeout(()=>{
      fun.apply(this, rest)
      clearTimeout(timer)
      timer = null
    }, time)
  }
}

const callback = function(...rest){
	console.log((new Date().getTime()), rest)
}

window.addEventListener('scroll', throttle(callback, 1000))

过程: 两者均是利用外层函数提供一个变量共内层函数使用; 时间戳版本,通过时间来比较,如果间隔时间内执行过了才重新计时; 定时器版本,通过定时器,如果定时器执行过了才会重新设置定时器; ​

防抖和节流的主要区别:防抖是一段时间内触发了,就清除定时器重新计时,直到一段时间内没有触发了,才执行回调;而节流是一段时间内触发多次了,只会执行一次回调,并重新计时。