javascript setTimeout 参数最大值问题和递归调用
javascript setTimeout 参数最大值问题和递归调用
这是一段最简单的代码
setTimeout(() => {console.log('3s后触发');
}, 3000);
但是如果timeout值很大的话,比如
setTimeout(() => {console.log('25天后触发');
}, 1000 * 60 * 60 * 24 * 25);
就会报错,并且立马执行
所以如果想设置一个大于24天的定时器怎么办,最简单的办法还是递归
function createTimeout(timeGap, callback, uniqueKey, map) {const MAXGap = 1000;if (timeGap > MAXGap) {const timeouId = setTimeout(async function (timeGap, uniqueKey, map) {createTimeout(timeGap, callback, uniqueKey, map);}, MAXGap, timeGap - MAXGap, uniqueKey, map);map.set(uniqueKey, timeouId);} else {const timeouId = setTimeout(async function (uniqueKey, map) {delTimeOut(map, uniqueKey);await callback();}, timeGap, uniqueKey, map);map.set(uniqueKey, timeouId);}
}function delTimeOut(map, uniqueKey) {const tiemout = map.get(uniqueKey);if (tiemout) {clearTimeout(tiemout);}map.delete(uniqueKey);
}
这是我封装的一个递归setTimeout
timeGap是定时器到现在的时间,毫秒
callback是定时要执行的函数
map是传入的一个new Map()对象,用于记录setTimeout返回值,在必要时中断递归
uniqueKey是调用时的一个给定值,用于标记这是哪个定时器
delTimeOut用于清除某个递归的定时器
let i = 0;
setInterval(function () {i++;console.log(i + "s later");
}, 1000);function createTimeout(timeGap, callback, uniqueKey, map) {const MAXGap = 1000;if (timeGap > MAXGap) {const timeouId = setTimeout(async function (timeGap, uniqueKey, map) {createTimeout(timeGap, callback, uniqueKey, map);}, MAXGap, timeGap - MAXGap, uniqueKey, map);map.set(uniqueKey, timeouId);} else {const timeouId = setTimeout(async function (uniqueKey, map) {delTimeOut(map, uniqueKey);await callback();}, timeGap, uniqueKey, map);map.set(uniqueKey, timeouId);}
}function delTimeOut(map, uniqueKey) {const tiemout = map.get(uniqueKey);if (tiemout) {clearTimeout(tiemout);}map.delete(uniqueKey);
}const uniqueKey = 100;
const timeOutEndSet = new Map();createTimeout(4002, function () {console.log('4秒多后触发');
}, uniqueKey, timeOutEndSet);
我这里设置递归的时间时1秒
中间没有清除递归逻辑
结果如下:
现在加上清除递归逻辑:
在上面的代码最后面加上如下代码,表示3秒后清除设定的定时器
setTimeout(() => {delTimeOut(timeOutEndSet, uniqueKey);
}, 3000);
可以发现定时器在第3秒已经被清除
最后, const MAXGap = 1000;这个建议改成大一点
上面的1000时为了验证代码正常运行
const MAXGap = 1000 * 60 * 60 * 24 * 24;
可以优化的地方:支持callback参数从外部传参,可以增加createTimeout参数
javascript setTimeout 参数最大值问题和递归调用相关推荐
- JavaScript函数之实际参数对象(arguments) / callee属性 / caller属性 / 递归调用 / 获取函数名称的方法...
函数的作用域:调用对象 JavaScript中函数的主体是在局部作用域中执行的,该作用域不同于全局作用域.这个新的作用域是通过将调用对象添加到作用域链的头部而创建的(没怎么理解这句话,有理解的亲可以留 ...
- 【C语言函数】 - 库函数、自定义函数、函数参数、函数调用、嵌套调用链式访问、递归与迭代、缓冲区
目录 一.函数是什么 二.C语言中函数的分类 1.如何学会使用库函数 1.1.strcpy 1.2.memset 2.自定义函数 2.1.与库函数的区别 2.2.写一个函数可以找出两个整数的最大值 2 ...
- JavaScript setTimeout用法,js setTimeout带参数
JavaScript setTimeout用法,js setTimeout带参数 ================================ ©Copyright 蕃薯耀 2021-07-07 ...
- 【函数的定义、调用(嵌套调用、递归调用)、声明、函数的分类(有无返回值、有无参数)、变量(自动变量与静态变量、局部变量与全局变量、只读变量)】(学习笔记7--函数)
第一篇博文,打卡新星计划第三季3.4~4.4,希望能有质的飞跃,顶峰相见 一.自定义函数 1.函数的定义 函数在使用前也需要定义,定义的格式如下: 数据类型 函数名([数据类型 参数1],[数据类型 ...
- python3_函数_形参调用方式 / 不定长参数 / 函数返回值 / 变量作用域 / 匿名函数 / 递归调用 / 函数式编程 / 高阶函数 / gobal和nonlocal关键字 / 内置函数
1.形参的调用方式 1. 位置参数调用 2. 关键词参数调用 原则: 关键词参数调用不能写在位置参数调用的前边 def test1(name, age):print("name:" ...
- oracle有一百个人围一圈报数,案例:Oracle创建表时报session超过最大值 ORA-00018 证明递归ses...
天萃荷净 创建表时报session超过最大值 证明递归session存在并不在v$session中显示 我们在数据库的使用过程中,有时候会遇到类似情况,我会话是登录的,但是我进行某种操作,缺报sess ...
- JavaScript 对引擎、运行时、调用堆栈的概述理解
JavaScript 对引擎.运行时.调用堆栈的概述理解 随着JavaScript越来越流行,越来越多的团队广泛的把JavaScript应用到前端.后台.hybrid 应用.嵌入式等等领域. 这篇文 ...
- Javascript setTimeout()
文章目录 示例 1:3 秒后显示一次文本 示例 2:每 3 秒显示一次时间 JavaScript clearTimeout() 示例 3:使用 clearTimeout() 方法 参考文档 在 ...
- JavaScript 各种参数 详解(十二)
程序代码 ' *---------------------------------------------------------------------------- ' * 函数:CheckIn ...
最新文章
- 解决Error response from daemon: Get https://registry-1.docker.io/v2/library/hello-world/manifests/
- Java的基础方法Java的对象_java基础之 创建对象的几种方式
- Java微信二次开发(八)
- linux vim编辑kconfig 无法wq,Linux-4.9.2内核在mini2440上的移植(三)——编译环境测试...
- 怎么添加本地音乐_展示 | 传一学员优秀项目之音乐播放器
- 未能加载文件或程序集或它的某一个依赖项_手写一个miniwebpack
- 前端知识笔记汇总200304
- 使用wget命令镜像网站
- JCreator中怎样带参数运行程序,如何添加JDBC驱动程序
- oeasy教您玩转vim - 52 - # 正则查找
- linux ubi 分区,Linux ubi子系统原理分析
- cs架构的软件中服务器作用,cs架构(cs架构基本原理)
- Lucene DocValues索引文件详解
- 抑郁焦虑测试软件可信度,做题自测抑郁症可靠吗
- FFMPEG4.1源码分析之 内存管理APIs av_freep() av_free()
- win10家庭版访问域文件服务器拒绝,解决Win10系统文件夹拒绝访问的方法
- linux系统程序下载,Linux平台的下载程序
- pos机小票打印机編程
- Android.mk文件语法规范(Android.mk File)
- C语言的下载和环境设置
热门文章
- C语言编程常用宏定义
- 7-2 sdut-oop-6 计算各种图形的周长(多态) (10 分)
- 【MapReduce】基本原理
- 2013年中国android智能手机用户调查研究报告,ZDC:2013年7月中国智能手机市场分析报告...
- BZOJ 1029: [JSOI2007]建筑抢修 堆+贪心
- 单片机 P0口、P1口 寄存器和引脚的不同
- Linux内网测试80端口带宽,Linux Centos测试服务器上行下行带宽,服务器带宽测速...
- 二、代码实现深度学习道路训练样本数据的制作(代码部分详解)——重复工作+多次返工的血泪史
- 计算机网络配置与应用教学设计,计算机网络与应用教学设计
- 观点:灵魂绑定NFT和去中心化社会