javascript - 嵌套的 setTimeout 方法如何按顺序执行?
问题描述
setTimeout(() => {
console.log(1);
setTimeout(() => {
console.log(2);
setTimeout(() => {
console.log(3);
}, 1000);
}, 1000);
}, 1000)
为什么此代码允许您按顺序每隔一秒控制台登录一次?我预计代码会同时运行 1、2、3,因为所有计时器都设置为 1000 毫秒。
解决方案
传递给的延迟参数是执行回调函数之前setTimeout
所需的最短时间;这不是回调运行的实际时间。
回调按照其计时器到期的顺序运行,并被推入任务队列。当堆栈为空时,它们从任务队列中被推送到调用堆栈。
在任务队列中首先推送的回调是第一个被推送到调用堆栈的回调。因此,它是第一个被执行的。
为什么此代码允许您按顺序每隔一秒控制台登录一次?
那是因为每个内部setTimeout
回调还需要考虑 wrapper 的延迟setTimeout
。
第二个的回调函数setTimeout
有 2 秒的延迟,因为第二个setTimeout
是在第一个计时器在 1 秒后到期后调用的。
同样,最内层setTimeout
有3秒的延迟。
推荐阅读
- android - 签名的APK第二次安装失败
- r - 强制数据帧数据类型从一个到另一个/复制模式
- selenium - Selenium WebdriverManager
- c# - Assembly.LoadFrom 无法加载 DLL
- css - 使用 CSS 在不同位置垂直对齐多个堆叠项目
- database - 使用远程数据库作为 Spring Boot 数据源
- flutter - 从 SwitchListTile 返回 True 值?
- json - 如何获取json对象的列表
- arrays - 在表格中的数组公式中使用 Vlookup
- ecmascript-6 - 仅具有函数名称时,es6 类成员之间有区别吗?