Event Loop

87 阅读1分钟

JavaScript是一个单线程的脚本语言。

Event Loop即事件循环,是指浏览器或Node的一种解决javaScript单线程运行时可能阻塞的一种机制。

浏览器中的 Event Loop

  1. 函数入执行栈,当Stack中执行到异步任务的时候,就将他丢给WebAPIs,接着执行同步任务,直到Stack为空;
  2. 此期间WebAPIs完成这个事件,把回调函数放入任务队列中等待执行(微任务放到微任务队列,宏任务放到宏任务队列)
  3. 执行栈为空时,Event Loop把微任务队列执行清空;
  4. 微任务队列清空后,进入宏任务队列,取队列的第一项任务放入Stack(栈)中执行,回到第1步。

node.js中的 Event Loop

Node.js 将各种任务分成至少 6 类,按先后顺序调用,因此将时间分为六个阶段:

  1. timers 阶段(setTimeout
  2. I/O callbacks
  3. idle, prepare
  4. poll 轮询阶段,停留时间最长,可以随时离开。
    • 主要用来处理 I/O 事件,该阶段中 Node 会不停询问操作系统有没有文件数据、网络数据等
    • 如果 Node 发现有 timer 快到时间了或者有 setImmediate 任务,就会主动离开 poll 阶段
  5. check 阶段,主要处理 setImmediate 任务
  6. close callback

微任务和宏任务

JavaScript中,任务被分为两种,一种宏任务(MacroTask)也叫Task,一种叫微任务(MicroTask)。

MacroTask(宏任务): script全部代码、setTimeoutsetIntervalsetImmediate(浏览器暂时不支持,只有IE10支持)

MicroTask(微任务): Process.nextTickNode独有)、PromiseObject.observe(废弃)、MutationObserver