准确的JavaScript睡眠功能

时间:2019-06-06 07:35:26

标签: javascript settimeout sleep

我正在使用JavaScript定期发送请求(每5 ms个)。

我尝试使用setTimeoutsleep function,但是它们都没有准确的时间。

他们确保时间间隔为>= 5ms,而不是== 5ms。 有想法吗?

这似乎很难用javascript实现,甚至不可能!!

这是我正在使用的代码:

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}



async function sendRequest(){ 
    var i;
    for (i=1; i<= numberOfRequests; i++){
        // send my i^th request here
        await sleep(5);
    }
}

2 个答案:

答案 0 :(得分:1)

没有任何一种方法可以用任何编程语言提供准确的超时,就像它们存在于通用多程序操作系统中一样。发生这种情况是因为操作系统将其时间片分配给特定进程的确切时间是无法预测的。

此外,JavaScript是单线程的,并且可以与event loop system一起使用,并且异步任务(例如setTimehout,xhr回调,单击侦听器等)仅在所有当前代码被执行后才执行。完成。例如,如果您有:

<div id="polygon-shape-outside">

setTimeout(() => console.log('hello world'), 500); for (let i = 0; i<1E100; i++) { console.log(Math.sqrt(i)); } 仅在所有计算完成后才打印。

答案 1 :(得分:0)

由于javascript使用单个线程事件循环,因此无法获得这种准确性。当引擎完成上一个任务时,将执行事件循环中的事件。如果您将任务设置为在20毫秒后执行(setTimeout,setInterval或任何其他自定义任务),则引擎会将该任务添加到事件循环中,然后它将尝试运行循环中的任何其他任务(假设一个函数需要25毫秒即可运行)。由于javascript是单线程的,因此您可以从循环中启动任何其他元素,直到25ms任务完成为止。在这种情况下,即使将其设置为20,您的超时也会在25毫秒后开始。这是javascript体系结构的工作方式。

即使实现了多线程(工作人员,线程等),事件循环仍将存在于每个线程中(每个线程都有自己的循环)