因此,我们都知道setTimeout在执行某些操作之前会等待一段时间。我的问题是,它是等待上面的代码先完成执行,还是等待一秒钟再执行其他操作,还是只是等待一秒钟,并且上面的代码是否已完成执行,它会执行其余的代码?反正代码?
if (1 == 1) {
//huge chunk of code
} //end of if (1 == 1)
var theTime = 1000;
var timeout = setTimeout("location.reload(true);", theTime);
function resetTimeout() {
clearTimeout(timeout);
timeout = setTimeout("location.reload(true);", theTime);
} //end of function resetTimeout()
我的目标是使代码的第一部分完成执行,然后在代码的第一部分完成执行后刷新页面。有办法吗?
答案 0 :(得分:2)
对于您来说,该页面将在调用setTimeout
之后1秒钟重新加载。因此,这是“大量代码”时间加上1秒的时间。
要在代码的第一部分完成后立即刷新页面,只需调用location.reload
而不使用setTimeout
:
if (1) {
//huge chunk of code
}
location.reload(true);
编辑:此方法不等待异步代码完成。例如,下面的程序在弹出警告框之前被重新加载中断。
if (1) {
setTimeout(() => alert('Test'), 1000);
}
location.reload(true);
答案 1 :(得分:0)
如果将Timeout设置为一个很小的值(例如1ms,甚至可能为零,但尚未检查),则它将在您的主代码完成后立即执行。它不会在您的主要代码完成之前执行,因为JavaScript不是多线程的。
答案 2 :(得分:0)
JavaScript是单线程且非抢占式,因此无法中断正在运行的代码。直到超时和AJAX回调之类的异步代码才能运行,直到当前执行的代码返回到主事件循环为止。
setTimeout
中的计时器在被调用时立即启动。但是由于是单线程设计,因此直到您当前的所有JS完成后才能调用回调。如果花费的时间超过计时器,则回调将被延迟。因此,您可以保证的是,至少将在该时间量内调用回调函数-它可能更长,但不会更短。事件队列中也可能还有其他异步回调。