繁体   English   中英

如何将 setTimeout 与 bigint 一起使用?

[英]How can I use setTimeout with bigint?

我正在尝试将 setTimeout 与 bigint 一起使用,以避免在增加超时计时器时超过 32 位 integer 限制(这确实发生在我的代码中)。

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 是否仍会转换为大 integer。

我尝试做的另一件事是使用++运算符对其进行转换,但它给我带来了错误: Uncaught TypeError: Cannot convert a BigInt value to a number

let _500 = 500n
setTimeout(console.log, _500++, "I waited 500 ms");

包括 Internet Explorer、Chrome、Safari 和 Firefox 在内的浏览器在内部将延迟存储为 32 位签名的 integer。 当使用大于 2,147,483,647 毫秒(约 24.8 天)的延迟时,这会导致 integer 溢出,从而导致立即执行超时。
https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout#maximum_delay_value

这是一个XY 问题 最好将超时设置为最大值,您将得到不一致的结果 为此使用cron工具。

如果这不是针对服务器的,我不确定任何用户是否会在 24 天(2147483647 毫秒)内保持浏览器打开,这将达到setTimeout的限制。 如果这是针对服务器的,那么 cron 选项卡确实会为您提供更好的服务。

如果您绝对必须使用较大的值,则可以设置一个包装器,该包装器会在前一个超时结束时创建新的超时,直到您等待整个时间。

2147483647 就好了,知道你的位限制

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM