Forráskód Böngészése

feat: 解释node的事件循环

liucong5 2 éve
szülő
commit
896d125dee
1 módosított fájl, 22 hozzáadás és 1 törlés
  1. 22 1
      NodeJS/README.md

+ 22 - 1
NodeJS/README.md

@@ -1951,4 +1951,25 @@ promise 3
 setTimeout 0
 setImmediate
 setTimeout 2
-```
+```
+
+`setImmediate` 和 `setTimeout` 理论执行顺序是 `setTimeout` 先执行,但是并不能确定每次执行都是 `setTimeout` 先执行
+
+```js
+setTimeout(function () {
+console.log(`setTimeout`)
+}, 0)
+
+setImmediate(() => { console.log(`setImmediate`) })
+```
+
+多次执行上述代码,会发现两个回调的执行顺序并不是每次都一样
+
+`setTimeout` 会将定时任务先添加到一个**时间管理器**中,然后由时间管理器判断是否可以执行,再将其添加到宏任务列表
+
+初始化时间管理器,并将任务添加到事件列表中,假设这个流程花费 **10ms**;与此同时,`node` 也会初始化事件循环,假设初始化事件循环需要 **20ms**。那么事件管理器开始运行的时候 `setTimeout` 的队列中存在任务,就会正常执行
+
+如果 初始化时间管理器用时**20ms**, 但是`node` 的初始化事件循环用了 **5ms**,那么此时 `setTimeout` 的队列中还没有任务,因为此时时间管理器的初始化流程还没有结束,所以不会执行第一个 `setTimeout,而是去执行` `setImmediate`
+
+上面 `setImmediate` 和 `setTimeout` 的执行乱序只会在初始化的时候出现
+