我需要回答的关于 setTimeout 的问题

Question about setTimeout that I need answer to

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

我的目标是让第一部分代码执行完毕,然后在第一部分代码执行完毕后立即刷新页面。有办法吗?

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

在您的情况下,页面将在 setTimeout 调用 1 秒后重新加载。所以是 "huge chunk of code" 时间加 1 秒。

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

if (1) {
  //huge chunk of code
}

location.reload(true);

编辑:这种方法不等待异步代码完成。例如下面的程序在弹出警告框之前被重新加载中断了。

if (1) {
  setTimeout(() => alert('Test'), 1000);
}

location.reload(true);

JavaScript 是单线程和非抢占式的,不可能中断 运行ning 的代码。异步代码,比如超时和AJAX回调,不能运行直到当前正在执行的代码returns到主事件循环。

setTimeout 中的计时器在调用时立即启动。但是因为单线程的设计,回调只能等到你当前的JS全部执行完才能调用。如果这花费的时间比计时器长,则回调将被延迟。因此,您可以保证的是回调将至少在该时间段内被调用——它可能更长,但不会更短。事件队列中也可能有其他异步回调。