JavaScript事件循环机制和NodeJS时间循环机制

JavaScript事件循环机制

image.png

一、是什么?

JavaScript是一门单线程语言,同一时间只能做一件事,但并不意味着单线程就是阻塞,而实现单线程非阻塞的方式就是事件循环。

JavaScript中,所有的任务都可以分为:

  • 同步任务:立即执行的任务,同步任务一般会直接进入到主线程中执行
  • 异步任务:异步执行的任务,例如ajax请求,或者setTimeout函数
image.png

从上面可以看出,同步任务进入主线程,异步任务进入任务队列,主线程内的任务执行完毕为空,会去读取任务队列对应的任务,推入主线程执行。上述过程不断重复就是事件循环机制。

二、宏任务与微任务

异步任务又分为宏任务与微任务

微任务

  • script (可以理解为外层同步代码)
  • setTimeout/setInterval
  • setImmediate、I/O(Node.js)

微任务

  • Promise.then
  • process.nextTick(NodeJS)
image.png

执行宏任务时,遇到微任务就放入微任务任务队列中,当宏任务执行完成后,会查看微任务的事件队列,然后将微任务依次执行完,再进行循环执行下一个宏任务。

NodeJS事件循环机制

image.png
  • Timers:用于存储定时器额回调函数(setInterval,setTimeout)
  • Pending callbacks:执行与操作系统相关的回调函数,比如启动服务器端应用时监听端口操作的回调函数就在这里调用。
  • 闲置阶段(idle, prepare):仅系统内部使用
  • 轮询阶段(poll):检索新的 I/O 事件;执行与 I/O 相关的回调(几乎所有情况下,除了关闭的回调函数,那些由计时器和 setImmediate() 调度的之外),其余情况 node 将在适当的时候在此阻塞
  • 检查阶段(check):setImmediate() 回调函数在这里执行
  • 关闭事件回调阶段(close callback):一些关闭的回调函数,例如关闭数据库连接的回调

你可能感兴趣的:(JavaScript事件循环机制和NodeJS时间循环机制)