首先,咱们来看一下event loop是干吗用的。node
好比,如今执行了一个2s的setTimeout,浏览器主线程执行,而后调用web API中的setTimeout,接下来浏览器的定时器线程开始计数,2s以后,事件触发线程开始处理setTimeout的回调函数,把这个回调函数扔到任务队列中,此时,event loop开始执行任务队列。因此,event loop能够理解成是来执行任务队列的。web
在开始介绍event loop以前,还须要了解两个概念,就是宏任务和微任务。浏览器
宏任务和微任务是异步任务的两种分类:
宏任务包括script,setTimeout/setInterval,setImmediate,I/O和UI rendering;
而微任务包括了Promise,Object.observe,Mutation.Observer和postMessage。异步
知道它是干吗用的,又知道了宏任务和微任务,那么咱们来看看它究竟是个啥。函数
Event loop,按照字面意思翻译就是 事件循环。事件,就是处理异步任务,处理宏任务和微任务,而循环就是循环去处理。那么它是怎么样处理的呢?oop
如今js的执行环境主要有两个,一个是浏览器,一个是nodejs,这两个环境中都有对应的event loop。下面咱们分开来讲。post
来看张图spa
可能只看这些仍是不清晰,那么咱们再来一个例子。线程
console.log(1); setTimeout(function() { console.log(2); }, 0); Promise.resolve().then(function() { console.log(3) }); console.log(4);
你以为这段代码会怎么输出?翻译
输出结果: 1 4 3 2
为何呢?
这就是一个完整的过程。
一个Event loop有一个或多个任务队列,每个Event loop只有一个微任务队列
以上就是浏览器的Event loop
nodejs的event loop有6个阶段:
以上这些阶段,每个阶段都有一个callback的先进先出的队列须要执行,当event loop运行到指定阶段时,该阶段的fifo队列将会被执行,当队列callback执行完成或执行的callback数量超过该阶段的上限时,event loop会转入下一个阶段。
这6个阶段,咱们如今只关注3个,分别是timer,poll和check。
再来看个图
proccess.nextTick() 是一个异步的node API,可是不属于event loop阶段,调用时,event loop会停下来,先去执行这个方法的回调