setInterval delay最大值问题
发布于 8 年前 作者 yuyunliuhen 5917 次浏览 最后一次编辑是 6 年前

有需求,需要设置1个月后的配置,所以加了个timer,然后发现超过 24天(2118012000)左右就会立即执行,所以猜想他的最大值为2^31(2147483648),还有没有其他方式可以突破这个限制,比如其他的库或者API。谢谢!

14 回复

两个setTimeout都设定15天,第一个callback里面启动第二个setTimeout,在第二个里面干你想干的,并再次启动第一个。。。。。。 没试过,应该能行吧…

可以换个思路… 设一个变量指定下次运行的日期 设一个setTimeout,其间隔时间可以是1小时,2小时,1天也可以,这个要看你对业务逻辑执行的时间要求精度来决定。这个setTimeout的逻辑中检查当前日期是否与上面的日期变量时间一致,如果一致,执行逻辑,再更新上面的变量。

定时任务为什么要用setInterval去实现啊,你能保证一个月中间node进程不挂? 用其他成熟的定时任务方案吧

@hylin 其他成熟的定时有哪些能推荐下吗

这种要用cron吧。。。setInterval太奇葩

试试node-schedule

@hylin 定时任务存数据库了,即便重启重新加一个定时器; 后来改方案了,用一个计时器,定期监测事件到期,其实这个只是一个 工具,使用也不会太多,所以也不用考虑太多 谢谢~

setTimeout(cb, ms)# 在至少ms毫秒后调用回调cb。实际延迟取决于外部因素,如操作系统定时器粒度及系统负载。

显示原文其他翻译纠错 超时值必须在1-2147483647的范围内(包含1和2147483647)。如果该值超出范围,则该值被当作1毫秒处理。一般来说,一个定时器不能超过24.8天。

setTimeout(nextset,152460601000)

var nextset = function(){ setTimeout(main,152460601000) }

var main = ……;

这么长的周期,node 挂了不就就惨了。。

如果中间node挂了次。。那不是悲剧了

重写了

var _setTimeout=function(callback, millisecond) {
		var max = Math.pow(2, 31) - 1;
		var now = millisecond;
		if (millisecond > max) {
			now = max;
		}
		var remain = millisecond - max;
		return setTimeout(function() {
			if (remain <= 0) {
				callback();
			} else {
				_setTimeout(callback, remain);
			}
		}, now)
	}

发布于3年前,最后一次修改6月前。。。难道说。。。还没想出办法么。。。汗。你可以setInterval设1分,然后每次用Date.now()来判断不就行了。。。

crontab 有益身心健康 mq也可以啊

回到顶部