Javascript 关于设置超时的问题,我需要回答

Javascript 关于设置超时的问题,我需要回答,javascript,location,settimeout,userscripts,Javascript,Location,Settimeout,Userscripts,所以我们都知道setTimeout在执行某项操作之前会等待一定的时间。我的问题是,它是先等上面的代码完成执行,然后再等一秒钟执行其他东西,还是只等一秒钟,不管上面的代码是否完成执行,它都会执行其余的代码 if (1 == 1) { //huge chunk of code } //end of if (1 == 1) var theTime = 1000; var timeout = setTimeout("location.reload(true);", theTime); function

所以我们都知道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()

我的目标是让代码的第一部分完成执行,然后在代码的第一部分完成执行后立即刷新页面。有什么方法可以做到这一点吗?

如果您将Timeout设置为一个非常小的值(例如1ms,甚至可能为零,但尚未检查),它将在主代码完成后立即执行。在主代码完成之前,它不会执行,因为JavaScript不是多线程的。

在您的情况下,页面将在调用
setTimeout
后1秒重新加载。这就是“大量代码”的时间加上1秒

要在代码的第一部分完成后立即刷新页面,只需调用
location.reload
,而不调用
setTimeout

if(1){
//大量代码
}
位置。重新加载(true);
编辑:这种方法不会等待异步代码完成。例如,在弹出警报框之前,重新加载会中断以下程序

if(1){
setTimeout(()=>alert('Test'),1000);
}
位置。重新加载(true);

JavaScript是单线程、非抢占式的,不可能中断正在运行的代码。异步代码(如超时和AJAX回调)在当前执行的代码返回到主事件循环之前无法运行


setTimeout
中的计时器在调用时立即启动。但由于采用单线程设计,在当前所有JS完成之前无法调用回调。如果这比计时器的时间长,那么回调将被延迟。因此,您所能保证的是回调将在至少该时间内被调用——可能更长,但不会更短。在事件队列中,它前面可能还有其他异步回调。

因此,如果将它设置为1秒,它将等待代码执行完毕,然后等待一秒钟再执行其他内容?如果将它放在繁重的代码之后,则是。如果你把它放在繁重的代码之前,那么我不确定它是否会再等一秒钟。但是,这肯定会发生在你的大量代码之后,从来没有发生过。这是一个好问题,我似乎找不到任何文档来说明计时器何时启动。