提问人:Chinmay Behera 提问时间:9/23/2023 最后编辑:Tamir AbutbulChinmay Behera 更新时间:9/23/2023 访问量:37
javascript 中的 SetTimeout()
SetTimeout () in javascript
问:
在 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 代码。
有没有其他方法可以在所需的时间间隔后准确地执行所需的代码。
答:
在 setTimeout() 函数中给出时间归档有什么意义?
指定所需的近似延迟。或者换一种说法,对代码应该运行多长时间给出一个最低限度的数字(虽然接受它可能会晚于此运行)。
有没有其他方法可以在所需的时间间隔后准确地执行所需的代码。
不可以,因为 JavaScript 在每个领域(松散地、每个全局环境等)运行一个线程,并且使用作业队列工作,一旦一个作业启动,它就会运行到完成,并且不会被另一个作业中断。因此,由于另一个作业可能在您提供的确切时间发生时正在运行,因此无法准确安排它。
也就是说,这通常不是问题,除非在代码中 1) 错误地假设超时将在确切的时间后发生,和/或 2) 错误地阻塞线程,就像您的示例代码所做的那样(尽管我假设这只是出于示例的目的)。
问题 #1 的一个例子:假设你有一个动画(无论出于何种原因,无法用 CSS 完成),它需要运行两秒钟,并且(例如)有 20 个状态需要动画处理。成为问题 #1 牺牲品的代码将使用 20 个调用编写,假设每个调用需要 100 毫秒。由于您确定的原因,这是不正确的;时间可能不准确。编写该代码的正确方法是获取当前时间,用于在绘制页面之前请求回调,然后在回调中使用当前时间来查看您的实时进度,从而查看要执行的动画的哪个阶段。如果线程真的很忙,您可能只管理几个更新,而不是完整的 20 个更新,但动画仍将在大约正确的时间结束,并且每个更新将显示更新运行时间的正确状态。setTimeout(/*...*/, 100)
requestAnimationFrame
评论