项目中踩坑,记录下。
没有意识到 setTimeout/setInterval 计时器有最大值问题。

setTimeout(() => {
  console.log(1111)
}, 2 ** 31)

这部分代码,不会等到计时器结束,而是会被会被立即执行。

原因

setTimeout/setInterval 使用 int32 存储延时参数值,也就是说最大延时值是 2^31-1(约为24.85天) ,超过这个值会被立即执行。

解决方案

web

在 web 页面中很少有需要这么大延时值得情况,根据业务场景,超过1小时,不做定时器设置,1小时以内,做定时器设置。

node

服务端,确实有类似的情况,比如1月一次的定时任务。建议使用 corn 代替 setTimeout,也会比 setTimeout 更加准确。