如何解决嵌套的 setTimeout 方法如何按顺序执行?
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 秒的延迟。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。