问题描述
setTimeout(() => {
console.log(1);
setTimeout(() => {
console.log(2);
setTimeout(() => {
console.log(3);
},1000);
},1000);
},1000)
为什么这段代码允许你按顺序每秒登录一次 console.log?我预计代码会同时运行 1、2、3,因为所有计时器都设置为 1000 毫秒。
解决方法
您在第一个计时器的主体内设置了第二个计时器,因此 1000 毫秒后已经过去。因此它比第一个计时器晚一秒运行。与您的第三个计时器相同的故事。
如果您希望它们同时运行,则需要同时调用 setTimeout
。 “同时”和“考虑到计时器的工作方式,尽可能彼此接近”。如果您真的想一次按顺序运行它们,请使用单个 setTimeout
。 >
传递给setTimeout
的延迟参数是在执行回调函数之前所需的最短时间;这不是回调将运行的实际时间。
回调按照它们的计时器到期的顺序运行,并被推入任务队列。当堆栈为空时,它们从任务队列被推送到调用堆栈。
在任务队列中首先推送的回调是第一个被推送到调用堆栈的回调。因此它是第一个被执行的。
为什么这段代码允许您按顺序每秒进行一次 console.log?
这是因为每个内部 setTimeout
回调还需要考虑包装器 setTimeout
的延迟。
第二个 setTimeout
的回调函数有 2 秒的延迟,因为第二个 setTimeout
在 第一个计时器在 1 秒后到期后被调用。
同样,最里面的 setTimeout
有 3 秒的延迟。