setTimeout(() => {console.log('Hello')}, 1000),这句代码里面,是什么线程在 1000 毫秒之后把执行代码推入 js 的任务队列中的?

2021-03-02 11:53:56 +08:00
 jadeborner

是渲染进程中的计时器触发线程? 如果同时有大量的 setTimeout,是如何处理的? 比如 for(let i = 0; i < 10000; i++) { setTimeout(() => {}, 1000) }

1799 次点击
所在节点    程序员
8 条回复
togou
2021-03-02 12:26:45 +08:00
先推到队列 然后跑别的任务 然后再检查
Chenamy2017
2021-03-02 12:56:21 +08:00
先循环推入队列
zivyou
2021-03-02 13:28:11 +08:00
------------------------------------ event loop one tick
1. ------> process.nextTick();
2. ------> Timer // setTimeout, setInterval
3. ------> idle, prepare // node.js 内部使用
4. ------> poll // select,epoll 等系统调用的检查
5. ------> check // setImmediate
6. ------> close.callback // 一些资源的关闭调用回调

这个过程是事件循环的一个 tick.
node.js 是一个类似于一个时钟周期一个时钟周期去执行的,在每个时钟周期内去做上述步骤中的工作内容。
如果有很多个 setTimeout,那在上面的第 2 步那里,会将要执行的任务都放到一个队列中。每个 tick 来的时候,看一下这些任务到没到要执行的点,如果到了,就执行一下。
pkookp8
2021-03-02 13:28:27 +08:00
yyfearth
2021-03-02 13:46:03 +08:00
@jadeborner node 和 chrome browser js 一样的 v8 引擎啊
yyfearth
2021-03-02 13:46:43 +08:00
API 不一样 但是原理是一样的
otakustay
2021-03-02 13:57:25 +08:00
timeout 的任务一直在队列中,没有“延迟推入”的说法。这个任务上有一个标识( XX 时候开始,1000ms 后要执行),JS 引擎有空的时候就会翻到这个任务,看看时间到了没有,时间没到就把它再丢回队列里去排着
cxe2v
2021-03-02 14:04:33 +08:00
浏览器关于 JS 这块一共有 5 个线程,

GUI
JS 引擎
定时器
事件触发
异步请求

setTimeout 和 setInterval 是属于定时器线程将对应的任务推入任务队列

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/757567

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX