我正在尝试将 setTimeout 与 bigint 一起使用,以避免在增加超时计时器时超出 32 位整数限制(这在我的代码中确实发生过)。
setTimeout(console.log, 500n, "I waited 500 ms");
但是我抛出了这个错误:
Uncaught TypeError: Cannot convert a BigInt value to a number
我尝试这样做:
setTimeout(console.log, Number(500n), "I waited 500 ms");
但是我不确定 500 是否仍会转换为大整数。
我尝试做的另一件事是使用 ++
运算符转换它,但是它向我抛出了错误:
Uncaught TypeError: Cannot convert a BigInt value to a number
let _500 = 500n
setTimeout(console.log, _500++, "I waited 500 ms");
答案 0 :(得分:3)
包括 Internet Explorer、Chrome、Safari 和 Firefox 在内的浏览器在内部将延迟存储为 32 位有符号整数。这在使用大于 2,147,483,647 毫秒(约 24.8 天)的延迟时会导致整数溢出,从而导致立即执行超时。
https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout#maximum_delay_value
答案 1 :(得分:2)
这是一个 XY problem。您最多将获得 inconsistent results 将超时设置为最大值。为此使用 cron 工具。
如果这不是针对服务器,我不确定任何用户会在达到 setTimeout
限制的 24 天(2147483647 毫秒)内保持浏览器打开。如果这是用于服务器,那么 cron 选项卡真的会为您提供更好的服务。
如果您绝对必须使用一个大值,您可以设置一个包装器,它会在前一个超时结束时创建新的超时,直到您等待整个时间为止。
答案 2 :(得分:1)
2147483647 就好了,知道你的比特限制