浏览器事件循环

浏览器中的EventLoop是根据HTML5定义的规范来实现的,不同浏览器可能有不同的实现

事件队列

1.微任务队列(microstack queue)

  • queueMicrotask
  • Promise的then回调
  • Mutation Observer API

2.宏任务队列(macrotask queue)

  • 定时器(setTimeout,setInterval)
  • ajax
  • DOM监听
  • UI Rendering

执行顺序

规范:在执行任何宏任务之前,都需要保证微任务队列已经被清空

Node事件循环

Node中EventLoop是由libuv库实现的

node执行js文件

  • 先开启一个node进程(node进程拥有多线程)
  • 其中 js线程 -> 执行js代码,其他线程同浏览类似处理不同异步任务

Node架构图

libuv中主要维护了一个EventLoop和worker threads(线程池)

EventLoop负责调用系统的一些其他操作:文件IO、Network、child-processes等

Tick阶段

定时器(Timers)

本阶段执行已经被setTimeout和setInterval的调度回调函数

待定回调(Pending Callback)

对某些系统操作(如TCP错误类型)执行回调

idle,prepare

仅系统内部使用

轮询(poll)

检索新的I/O事件;执行与I/O相关的回调;

检测(check)

setImmediate回调函数在这里执行

关闭的回调函数

一些关闭的回调函数,如socket.on(‘close’,…)

Node的事件队列

微任务队列

  • next tick queue

    • process.nextTick
  • other queue

    • Promise的then回调
    • queueMicrotask

宏任务队列

  • timer queue

    • setTimeout
    • setInterval
  • poll queue

    • IO事件
  • check queue

    • setImmediate
  • close queue

    • close事件

每次事件循环Tick中执行顺序

  • next tick queue

  • other queue

  • timer queue

  • poll queue

  • check queue

  • close queue