1. 学习目标
- 什么是Eventloop
- 浏览器端的Eventloop起到了什么作用
- Node.js服务端的Eventloop的作用又表现在哪里
2. 浏览器的Eventloop
Eventloop理解成我们编写的Javascript和浏览器或者Node之间的一个桥梁。
浏览器的事件循环是我们编写的JavaScript代码和浏览器API调用(settimeout/AJAX/事件监听等)的一个桥梁,桥梁之间他们通过回调函数进行沟通。
JS在单线程上执行所有操作,虽然是单线程,但是能够有效地解决问题,并且能够带来一种多线程的错觉。这依赖于浏览器的Eventloop,能够大大提升代码的执行效率。
主要有以下三个部分组成
- 调用栈(call stack)
调用栈负责跟踪所有要执行的代码。
- 浏览器API库
每当调用事件队列中的异步函数是都会将其发送到浏览器的API,setTimeout方法就是一个比较典型的例子,它将操作发送到事件队列,这样就有了一个循环系统,用于在JS中运行异步操作。
- 事件队列
事件队列负责将新的function发送到队列中进行处理.
3. 举例说明
Eventloop通过两个队列来实现Event Queue放进来的异步任务,两个队列分别是宏任务队列和微任务队列:
以setTimeout为代表的任务被称为宏任务,放到宏任务队列中:
macrotasks(宏任务):
script(整体代码),setTimeout, setInterval, setImmediate, I/O, UI rending, event listener
以Promise为代表的任务被称为微任务,放到微任务队列中:
microtasks(微任务):
process, nextTick, Promises, Object.observe, MutationObserver
执行方式:
一次Eventloop循环会处理一个宏任务和所有这次循环中的微任务。
JavaScript引擎首先会从宏任务队列中取出第一个宏任务,执行完毕后,再将微任务中的所有任务取出,按照顺序分别全部执行,如果在这一步过程中,产生了新的微任务也是需要进行执行的,然后再从宏任务队列中取出下一个,执行完毕后,再次将微任务队列中所有任务执行完毕,循环往复,直到两个队列中的所有任务都取完。
4. node.js中的Eventloop
- node的事件循环是一个我们编写的Javascript代码和系统调用(file system,networke等)之间的一个桥梁,桥梁之间通过回调函数进行沟通。
主要有以下六个阶段:
- timers:执行setTimeout()和setInterval()触发的回调
- I/O callbacks:系统级别的回调函数
- idel,prepare:空闲准备阶段
- poll:检索新的I / O事件;执行I / O相关的回调(会执行几乎所有的回调,除了 close callbacks 以及 timers 调度的回调和 setImmediate() 调度的回调,在恰当的时机将会阻塞在此阶段)
- check:执行setImmediate()
- close callbacks:关闭回调函数,比如socket等