javascript 中的 SetTimeout()

SetTimeout () in javascript

提问人:Chinmay Behera 提问时间:9/23/2023 最后编辑:Tamir AbutbulChinmay Behera 更新时间:9/23/2023 访问量:37

问:

在 setTimeout() 函数中给出时间归档有什么意义? 尽管如此,回调将不得不等待调用堆栈完全为空。

例如,如果我写这段代码。

setTimeout(()=>console.log("2 sec Timeout"),2000)

不能保证它会在 2 秒后完全运行。如果有其他代码花费的时间超过 2 秒,则 setTimeout 回调将不得不等待其他代码运行,而不是运行超时代码。请看下面的例子。

var c= ()=>{
    setTimeout(()=>console.log("2 sec Timeout"),2000)
    console.log("c");
}
var d= ()=>{
    console.log("d");
    for (let index = 0; index < 10000000000; index++) {
    }
    console.log("End of for loop");
}
var e= ()=>{
    console.log("e");
    for (let index = 0; index < 10000000000; index++) {
    }
    console.log("End of for loop");
}
c()
d()
e()

在这里,settimeout 代码必须等待 d() 比 e() 完成,然后它将执行 setTimeout 代码。

有没有其他方法可以在所需的时间间隔后准确地执行所需的代码。

JavaScript 异步 回调 setTimeout

评论

0赞 Pointy 9/23/2023
不,别无他法。在正常代码中,您的超时将在未来大约 2 秒内触发,这对大多数人来说已经足够接近了。如果你想创建一个真正的实时系统,可能你选错了平台。
4赞 Keith 9/23/2023
你正在创建长时间运行的阻塞代码,这是你需要学习的事情,而不是在 Javacript 中做,除非你把阻塞代码放在 webWorker 中。
0赞 CherryDT 9/23/2023
你用你的循环阻塞了整个 CPU 内核很长时间 - 这通常不会发生。如果删除这些循环或将它们替换为异步活动(就像在实际代码中通常出现的情况一样),您将看到它在两秒钟后执行。

答:

1赞 T.J. Crowder 9/23/2023 #1

在 setTimeout() 函数中给出时间归档有什么意义?

指定所需的近似延迟。或者换一种说法,对代码应该运行多长时间给出一个最低限度的数字(虽然接受它可能会于此运行)。

有没有其他方法可以在所需的时间间隔后准确地执行所需的代码。

不可以,因为 JavaScript 在每个领域松散地、每个全局环境等)运行一个线程,并且使用作业队列工作,一旦一个作业启动,它就会运行到完成,并且不会被另一个作业中断。因此,由于另一个作业可能在您提供的确切时间发生时正在运行,因此无法准确安排它。

也就是说,这通常不是问题,除非在代码中 1) 错误地假设超时将在确切的时间后发生,和/或 2) 错误地阻塞线程,就像您的示例代码所做的那样(尽管我假设这只是出于示例的目的)。

问题 #1 的一个例子:假设你有一个动画(无论出于何种原因,无法用 CSS 完成),它需要运行两秒钟,并且(例如)有 20 个状态需要动画处理。成为问题 #1 牺牲品的代码将使用 20 个调用编写,假设每个调用需要 100 毫秒。由于您确定的原因,这是不正确的;时间可能不准确。编写该代码的正确方法是获取当前时间,用于在绘制页面之前请求回调,然后在回调中使用当前时间来查看您的实时进度,从而查看要执行的动画的哪个阶段。如果线程真的很忙,您可能只管理几个更新,而不是完整的 20 个更新,但动画仍将在大约正确的时间结束,并且每个更新将显示更新运行时间的正确状态。setTimeout(/*...*/, 100)requestAnimationFrame

评论

0赞 Chinmay Behera 9/25/2023
非常感谢你,这是非常有见地的。