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