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 参数最大值问题和递归调用相关推荐

  1. JavaScript函数之实际参数对象(arguments) / callee属性 / caller属性 / 递归调用 / 获取函数名称的方法...

    函数的作用域:调用对象 JavaScript中函数的主体是在局部作用域中执行的,该作用域不同于全局作用域.这个新的作用域是通过将调用对象添加到作用域链的头部而创建的(没怎么理解这句话,有理解的亲可以留 ...

  2. 【C语言函数】 - 库函数、自定义函数、函数参数、函数调用、嵌套调用链式访问、递归与迭代、缓冲区

    目录 一.函数是什么 二.C语言中函数的分类 1.如何学会使用库函数 1.1.strcpy 1.2.memset 2.自定义函数 2.1.与库函数的区别 2.2.写一个函数可以找出两个整数的最大值 2 ...

  3. JavaScript setTimeout用法,js setTimeout带参数

    JavaScript setTimeout用法,js setTimeout带参数 ================================ ©Copyright 蕃薯耀 2021-07-07 ...

  4. 【函数的定义、调用(嵌套调用、递归调用)、声明、函数的分类(有无返回值、有无参数)、变量(自动变量与静态变量、局部变量与全局变量、只读变量)】(学习笔记7--函数)

    第一篇博文,打卡新星计划第三季3.4~4.4,希望能有质的飞跃,顶峰相见 一.自定义函数 1.函数的定义 函数在使用前也需要定义,定义的格式如下: 数据类型 函数名([数据类型 参数1],[数据类型 ...

  5. python3_函数_形参调用方式 / 不定长参数 / 函数返回值 / 变量作用域 / 匿名函数 / 递归调用 / 函数式编程 / 高阶函数 / gobal和nonlocal关键字 / 内置函数

    1.形参的调用方式 1. 位置参数调用 2. 关键词参数调用 原则: 关键词参数调用不能写在位置参数调用的前边 def test1(name, age):print("name:" ...

  6. oracle有一百个人围一圈报数,案例:Oracle创建表时报session超过最大值 ORA-00018 证明递归ses...

    天萃荷净 创建表时报session超过最大值 证明递归session存在并不在v$session中显示 我们在数据库的使用过程中,有时候会遇到类似情况,我会话是登录的,但是我进行某种操作,缺报sess ...

  7. JavaScript 对引擎、运行时、调用堆栈的概述理解

    JavaScript 对引擎.运行时.调用堆栈的概述理解  随着JavaScript越来越流行,越来越多的团队广泛的把JavaScript应用到前端.后台.hybrid 应用.嵌入式等等领域. 这篇文 ...

  8. Javascript setTimeout()

    文章目录 示例 1:3 秒后显示一次文本 示例 2:每 3 秒显示一次时间 JavaScript clearTimeout() 示例 3:使用 clearTimeout() 方法 参考文档     在 ...

  9. JavaScript 各种参数 详解(十二)

    程序代码 ' *---------------------------------------------------------------------------- ' * 函数:CheckIn ...

最新文章

  1. 解决Error response from daemon: Get https://registry-1.docker.io/v2/library/hello-world/manifests/
  2. Java的基础方法Java的对象_java基础之 创建对象的几种方式
  3. Java微信二次开发(八)
  4. linux vim编辑kconfig 无法wq,Linux-4.9.2内核在mini2440上的移植(三)——编译环境测试...
  5. 怎么添加本地音乐_展示 | 传一学员优秀项目之音乐播放器
  6. 未能加载文件或程序集或它的某一个依赖项_手写一个miniwebpack
  7. 前端知识笔记汇总200304
  8. 使用wget命令镜像网站
  9. JCreator中怎样带参数运行程序,如何添加JDBC驱动程序
  10. oeasy教您玩转vim - 52 - # 正则查找
  11. linux ubi 分区,Linux ubi子系统原理分析
  12. cs架构的软件中服务器作用,cs架构(cs架构基本原理)
  13. Lucene DocValues索引文件详解
  14. 抑郁焦虑测试软件可信度,做题自测抑郁症可靠吗
  15. FFMPEG4.1源码分析之 内存管理APIs av_freep() av_free()
  16. win10家庭版访问域文件服务器拒绝,解决Win10系统文件夹拒绝访问的方法
  17. linux系统程序下载,Linux平台的下载程序
  18. pos机小票打印机編程
  19. Android.mk文件语法规范(Android.mk File)
  20. C语言的下载和环境设置

热门文章

  1. C语言编程常用宏定义
  2. 7-2 sdut-oop-6 计算各种图形的周长(多态) (10 分)
  3. 【MapReduce】基本原理
  4. 2013年中国android智能手机用户调查研究报告,ZDC:2013年7月中国智能手机市场分析报告...
  5. BZOJ 1029: [JSOI2007]建筑抢修 堆+贪心
  6. 单片机 P0口、P1口 寄存器和引脚的不同
  7. Linux内网测试80端口带宽,Linux Centos测试服务器上行下行带宽,服务器带宽测速...
  8. 二、代码实现深度学习道路训练样本数据的制作(代码部分详解)——重复工作+多次返工的血泪史
  9. 计算机网络配置与应用教学设计,计算机网络与应用教学设计
  10. 观点:灵魂绑定NFT和去中心化社会