EventLoop是什么?
前言: eventloop即事件循环,是指浏览器或Node的一种解决JAVASCRIPT单线程运行时不会堵塞的一种机制,也就是我们经常使用异步的原理。
简短:异步解决方案。
浏览器的实现:根据html5规范明确定义。
node的实现:libuv实现(恐龙头像)–thread pool (关键)
google和node都是用v8引擎,但是处理不一样。
EventLoop是一个执行模式,在不同的地方有不同的实现,浏览器和node.js基于不同的技术实现了各自的EventLoop。
宏任务,macrotask,也叫tasks。一些异步任务的回调会依次进入macro task queue,等待后续被调用,这些异步任务包括:
setTimeout
setInterval
setImmediate(Node独有)
requestAnimationFrame(浏览器独有)
I/O
UI rendering(浏览器独有)
微任务,microtask,也叫jobs.另一些异步任务的回调会依次进入micro task queue,等待后续被调用,这些异步任务包括:
process.nextTick(Node独有)
Promise.then()
Object.observe
MutationObserve
(注:这里只针对浏览器和NodeJS)
node的执行 6个阶段 6个异步任务队列循环 分宏任务和微任务 nextTick then
timer(计时器)
执行setTimeout以及
setInterval的回调
I/O callbacks
处理网络、流、tcp的错误(http.get)
callback
idle prepares
node内部使用
poll(轮询) <---- incoming:
执行poll中的i/o队列 connections,
检查定时器是否到时 data, etc.
check
处理setImmediate的回调
close callbacks
关闭的回调例如
socket.on(‘close’)
1、先执行全局Script同步代码
2、执行微任务,先执行next tick queue中所有的任务,再执行othter microtask queue中的所有任务
3、开始执行宏任务,共6个阶段,等六个阶段都执行完在回到步骤2。
浏览器的执行
一个函数执行栈、一个事件队列(一次拿一个 等所有微任务执行完 再去拿宏任务)和一个微任务队列(连着连着调 一次取所有)
undefined(一轮事件循环的执行完毕 后面的异步任务都是在第二轮的事件循环执行的)
执行栈(foo() query() hello())-> Web Api(异步任务) -> 任务队列(放的是宏任务–onclick、 onload,表示执行所有微任务,再取执行宏任务) -> 事件循环
在浏览器里面:
每从事件队列中取一个事件时,有微任务的话,一定先把所有的微任务执行完,然后才开始从任务队列中执行事件。
执行所有微任务->一个宏任务->执行所有微任务->一个宏任务->。。。。
在浏览器端,所有的宏任务都在同一个任务队列执行
在node端,宏任务分为六个任务队列
执行所有微任务->所有的宏任务(6个阶段)->所有的微任务->所有的宏任务(6个阶段)。。。
js的主线程是单线程。。。
setTimeout有一个取值范围
注: 以上的node环境是node10以下版本,node11版本开始,与浏览器的机制差不多。。。。。无语。。