浏览器和Node 事件循环

浏览器: 链接:https://www.jianshu.com/p/b221e6e36dcb

while (true) {
    主线程中的同步任务();
    宏任务队列.shift();
    微任务队列全部任务();
}

不相同啊: 链接:https://juejin.im/post/5c394da4518825253661bd4d

event loop 的概念。

  • Javascript是单线程的,所有的同步任务都会在主线程中执行。
  • 主线程之外,还有一个任务队列。每当一个异步任务有结果了,就往任务队列里塞一个事件。
  • 当主线程中的任务,都执行完之后,系统会 “依次” 读取任务队列里的事件。与之相对应的异步任务进入主线程,开始执行。
  • 异步任务之间,会存在差异,所以它们执行的优先级也会有区别。大致分为 微任务(micro task,如:Promise、MutaionObserver等)和宏任务(macro task,如:setTimeout、setInterval、I/O等)。同一次事件循环中,微任务永远在宏任务之前执行
  • 主线程会不断重复上面的步骤,直到执行完所有任务。

node环境: 

while (true) {
    loop.forEach((阶段) => {
        阶段全部任务();  // 当前循环的某类宏任务
        nextTick全部任务();
        microTask全部任务();
    });
    loop = loop.next;
}

循环之前

在进入第一次循环之前,会先进行如下操作:

  • 同步任务;
  • 发出异步请求;
  • 规划定时器生效的时间;
  • 执行process.nextTick()

开始循环

循环中进行的操作:

  • 清空当前循环内的 Timers Queue,清空 NextTick Queue,清空 Microtask Queue
  • 清空当前循环内的 I/O Queue,清空 NextTick Queue,清空 Microtask Queue
  • 清空当前循环内的 Check Queue,清空 NextTick Queue,清空 Microtask Queue
  • 清空当前循环内的 Close Queue,清空 NextTick Queue,清空 Microtask Queue
  • 进入下轮循环。

可以看出,nextTick 优先级比 Promise 等 microTask 高,setTimeoutsetInterval优先级比setImmediate高。


链接:https://www.jianshu.com/p/b221e6e36dcb
 

猜你喜欢

转载自blog.csdn.net/qq_31687021/article/details/89540882