如何将 setTimeout 与 bigint 一起使用?

时间:2021-03-18 20:11:20

标签: javascript settimeout

我正在尝试将 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");

3 个答案:

答案 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 就好了,知道你的比特限制

相关问题