代码笔记---JavaScript--(防抖-节流-清理所有定时器-定时任务)

文章目录

  • 清理所有定时器
  • 防抖代码
  • 节流代码
    • 自定义
      • 时间戳
      • 定时器
      • 复杂实现
    • vueuse中工具类
  • 定时任务
    • 手动实现
    • 工具类useInterval

清理所有定时器

export function clearAllTimer() {let id = setTimeout(() => { }, 0)while (id > 0) {window.clearTimeout(id)id--}
}

防抖代码

当函数绑定一些持续触发的事件如:resize、scroll、mousemove ,键盘输入,多次快速click等等,

如果每次触发都要执行一次函数,会带来性能下降,资源请求太频繁等问题

// 第一个参数是需要进行防抖处理的函数,第二个参数是延迟时间,默认为1秒钟
// 这里多传一个参数,immediate用来决定是否要第一次立即执行, 默认为false
function debounce(fn, delay = 1000, immediate = false, resultCb) {
// 实现防抖函数的核心是使用setTimeout// time变量用于保存setTimeout返回的Idlet time = null// isImmediateInvoke变量用来记录是否立即执行, 默认为falselet isImmediateInvoke = false// 将回调接收的参数保存到args数组中function _debounce(...args) {// 如果time不为0,也就是说有定时器存在,将该定时器清除if (time !== null) {clearTimeout(time)}// 当是第一次触发,并且需要触发第一次事件if (!isImmediateInvoke && immediate) {// 将函数的返回值保存到result中const result = fn.apply(this, args)if (typeof resultCb === 'function') {// 当用户传递了resultCb函数时,执行该函数,并将结果以参数传递出去。resultCb(result)}// 将isImmediateInvoke设置为true,这样不会影响到后面频繁触发的函数调用isImmediateInvoke = true;}time = setTimeout(() => {// 使用apply改变fn的this,同时将参数传递给fnfn.apply(this, args)  // 当定时器里的函数执行时,也就是说是频繁触发事件的最后一次事件// 将isImmediateInvoke设置为false,这样下一次的第一次触发事件才能被立即执行isImmediateInvoke = false}, delay)}// 防抖函数会返回另一个函数,该函数才是真正被调用的函数return _debounce
}

使用

const a =debounce(()=>{console.log('asd')})button.onclick(a)

button被点击的事件就被加上防抖函数了。

节流代码

限制代码访问频率,如某个代码1分钟只能执行一次。

自定义

时间戳

function throttle(func, wait) {var previous = 0;return function() {let now = Date.now();let context = this;let args = arguments;if (now - previous > wait) {func.apply(context, args);previous = now;}}
}
const throttledFn = throttle(count,1000);

定时器

function throttle(func, wait) {let timeout;return function() {let context = this;let args = arguments;if (!timeout) {timeout = setTimeout(() => {timeout = null;func.apply(context, args)}, wait)}}
}

复杂实现

// leading参数用来控制是否第一次立即执行,默认为true
function throttle(fn, interval, leading = true) {//该变量用于记录上一次函数的执行事件let lastTime = 0// 内部的控制是否立即执行的变量let isLeading = true// time 保存定时器的idlet time = nullconst _throttle = function(...args) {// 获取当前时间const nowTime = new Date().getTime()// 第一次不需要立即执行if (!leading && isLeading) {// 将lastTime设置为nowTime,这样就不会导致第一次时remainTime大于intervallastTime = nowTime// 将isLeading设置为false,这样就才不会对后续的lastTime产生影响。isLeading = false}// cd剩余时间const remainTime = nowTime - lastTime// 如果剩余时间大于间隔时间,也就是说可以再次执行函数if (remainTime - interval >= 0) {fn.apply(this, args)// 将上一次函数执行的时间设置为nowTime,这样下次才能重新进入cdlastTime = nowTime}if (remainTime < interval) {// 判断是否存在定时器,如果存在则取消掉if (time) clearTimeout(time)// 设置定时器time = setTimeout(() =>{// 由于该定时器,会在没有事件触发的interval时间间隔后才会执行,也就是说一轮事件// 执行已经结束,使用需要将isLeading复原,这样下一轮事件的第一次事件就不会立即执行了。isLeading = true}, interval)}}// 返回_throttle函数return _throttle
}

vueuse中工具类

const throttledFn = useThrottleFn(() => {// 操作,1s只能执行一次
}, 1000)

定时任务

手动实现

  setInterval(() => {handleQuery();}, 1000 * 60 * 5);

setInterval不晓得为啥有时候有bug

// 定时器查询
function handleQueryByInterval() {setTimeout(() => {handleQuery();handleQueryByInterval();}, 1000 * 60 * 5);
}

工具类useInterval

 useInterval(() => {handleQuery();}, 1000);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/177770.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

容器相关面试题

什么是容器&#xff1f; 容器是一种轻量级、可移植的软件打包和部署技术&#xff0c;用于将应用程序及其依赖项打包在一起以便在不同环境中运行。容器化技术的主要目标是提高应用程序的可移植性、一致性和可部署性。 关键特征和概念&#xff1a; 轻量级&#xff1a; 容器共享…

SpringCloud--分布式事务实现

一、分布式事务 首先要明白事务是指数据库中的一组操作&#xff0c;这些操作要么全部成功执行&#xff0c;要么全部不执行&#xff0c;以保持数据的一致性和完整性。在本地事务中&#xff0c;也就是传统的单机事务&#xff0c;必须要满足原子性(Atomicity)、一致性(Consistenc…

通过栅格地图,目标路径(目标点)建立距离场地图

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言(1)距离场输出(2)实现原理1、更新地图调用setLocalGoal()【一个目标点】,或setTargetCells()【一条路径】2、计算当前位置离目标路径的距…

Linux安全之auditd审计工具使用说明

一、auditd工具简介 audited是Linux审核系统的用户空间组件。它负责将审核记录写入磁盘。查看日志是通过ausearch或aureport实用程序完成的。审核系统或加载规则的配置是使用auditctl实用程序完成的。在启动过程中&#xff0c;/etc/audit/audit.rules中的规则由auditctl读取并加…

【傻瓜级JS-DLL-WINCC-PLC交互】1.C#用windows窗体控件创建.net控件

思路 JS-DLL-WINCC-PLC之间进行交互&#xff0c;思路&#xff0c;先用Visual Studio创建一个C#的DLL控件&#xff0c;然后这个控件里面嵌入浏览器组件&#xff0c;实现JS与DLL通信&#xff0c;然后DLL放入到WINCC里面的图形编辑器中&#xff0c;实现DLL与WINCC的通信。然后PLC与…

visual c++ 2019 redistributable package

直接安装下面包只有24M Microsoft Visual C Redistributable 2019 x86: https://aka.ms/vs/16/release/VC_redist.x86.exe x64: https://aka.ms/vs/16/release/VC_redist.x64.exe ———————————————— 版权声明&#xff1a;本文为CSDN博主「kpacnB_Z」的原创文章…

uniapp设置手机通知权限

提醒用户开启通知权限&#xff0c;与unipush功能联用 效果图&#xff1a; 方法&#xff1a; 直接使用即可&#xff0c;在真机或模拟器运行 setPermissions() {// #ifdef APP-PLUS if (plus.os.name Android) { // 判断是Androidvar main plus.android.runtimeMainActivity…

gRPC之grpc自定义负载均衡(resolver)

1、grpc自定义负载均衡(resolver) 1.1 proto编写和编译 syntax "proto3"; package pb; option go_package "./;pb";service Greeter {rpc SayHello (HelloRequest) returns (HelloReply) {} }message HelloRequest {string name 1; }message HelloRep…

oracle免费资源 终止实例 以及新建一台实例的折腾记录

事情的背景是这样的&#xff0c;我的一台oracle小鸡&#xff0c;不太好用的样子&#xff0c;有时候SSH连不上&#xff0c;有时候莫名其妙卡住。所以我就想把它重新安装一下系统&#xff0c;恢复成最初的样子。 然后在网上查资料&#xff0c;是有办法把系统重装一下的。但是略微…

抖去推--短视频账号矩阵系统saas工具源码技术开发

一、短视频矩阵系统搭建常见问题&#xff1f; 1、抖去推的短视频AI矩阵营销软件需要一定的技术水平吗&#xff1f; 答&#xff1a;不需要。产品简单易用&#xff0c;不需要具备专业的技术水平&#xff0c;即使是初学者&#xff0c;也能够轻松上手操作。 3、抖去推的短视频AI矩…

MySQL巧用公用表表达式(CTE)处理递归查询

概述 根据《MySQL 8.0 Reference Manual》的描述&#xff0c;Common Table Expressions&#xff08;简称CTE&#xff09;是一种名为临时结果集的表达式。它可以用来构造复杂的查询语句&#xff0c;并且可以在多个查询中重复使用同一个结果集。CTE的优点是可以使查询语句更加简…

神经网络可视化——基于torchviz绘制模型的计算图

神经网络可视化——基于torchviz绘制模型的计算图 第一步、安装 graphviz 和 torchviz 库 第二步、编写代码生成计算图 第三步、安装graphviz软件 在深入理解深度学习模型时&#xff0c;可视化网络结构是一个非常有用的手段。今天介绍如何使用 torchviz 和 graphviz 来生成网…

很清楚展示GPT插件的调用过程,人工智能(AI)的潜在危险与好处 超级智能 未来

好处&#xff0c;未来 很清楚展示GPT插件的调用过程&#xff1a; 把请求和要求发chatGPT chatGPT返回markdown格式发给插件 插件返回结果给用户。 你不用别人用。 人工智能&#xff08;AI&#xff09;的最危险之处通常与以下几个方面有关&#xff1a; 自主决策能力过强&…

数据挖掘 朴素贝叶斯

直入正题&#xff0c;直接看代码&#xff1a; 这是一段判断是不是藏话的代码 import numpy as np# 数据采集&#xff08;定义函数加载数据集&#xff09; def load_dataset():sent_list [[my, name, is, Devin],[you, are, stupid],[my, boyfriend, is, SB],[you, looks, ver…

元宇宙3d服装数字化交互展示营销平台大幅提高客户满意度和口碑

web3D云展营销平台是以web3d开发、VR虚拟现实和计算机技术&#xff0c;以展品3D展示、数字人&#xff0c;AI&#xff0c;社交等技术打造&#xff0c;为 Web3D可视化提供了丰富的展示形式和效果&#xff0c;实现将线下展厅、展品在线上1&#xff1a;1复刻呈现的线上场景营销。 w…

企业软件手机app定制开发新趋势|网站小程序搭建

企业软件手机app定制开发新趋势|网站小程序搭建 随着移动互联网的快速发展和企业数字化转型的加速&#xff0c;企业软件手机App定制开发正成为一个新的趋势。这种趋势主要是由于企业对于手机App的需求增长以及现有的通用应用不能满足企业特定需求的情况下而产生的。 首先&#…

使用char.js 柱形方式显示 一年12个月的最高气温与最低气温

<!DOCTYPE html> <html> <head><title>气温图表</title><script src"https://cdn.jsdelivr.net/npm/chart.js"></script><style>#myChart{width:800px;height: 400px;}</style> </head> <body>&l…

2023全球数字贸易大赛-web3,区块链,诺威信,浪潮云,微众区块链,福建中科星泰,瓴羊区块链,联想-元宇宙,硅基智能-

目录 诺威信B隐私计算平台 浪潮云=星火连-澳优码 HyperChain 产品介绍 CA认证即电子认证服务

离线安装python包,遇到is not a supported wheel on this platform

离线安装python包&#xff0c;遇到is not a supported wheel on this platform 行走_ 于 2022-10-14 23:11:27 发布 阅读量2.7k 收藏 8 点赞数6 分类专栏&#xff1a; Python 文章标签&#xff1a; python 开发语言 版权 Python 专栏收录该内容 46 篇文章2 订阅 订阅专栏…