在讲 Event Loop (事件循环)以前,咱们来了解点 node 的东西,来帮助咱们更加明白事件循环是干什么的vue
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,Node 不是一门语言,是让 js 运行在后端的,运行时不包括 js 全集,由于在服务端中不包含 DOM 和 BOM,Node 也提供了一些新的模块,好比 http,fs等模块。java
Node 的首要目标是提供一种简单的,用于建立高性能服务器的开发工具 Web 服务器的瓶颈在于并发的用户量,对比 Java 和 Php 的实现方式node
Web 主要场景就是接收客户端的请求读取静态资源和渲染界面,因此 Node 很是适合 Web 应用的开发。web
进程是操做系统分配资源和调度任务的基本单位,线程是创建在进程上的一次程序运行单位,一个进程上能够有多个线程。ajax
单线程特色是节约了内存,而且不须要在切换执行上下文。并且单线程不须要管锁的问题,所谓 锁,在 java 里才有锁的概念,因此咱们不用细研究数据库
整个的这种运行机制又称为 Event Loop (事件循环)后端
如图(图片是借鉴的):promise
同步代码先执行,执行是在栈中执行的,微任务大于宏任务,微任务会先执行(栈),宏任务后执行(队列)浏览器
讲到这里,敲几行代码来总结下咱们上面讲到的知识点把bash
《1》宏任务,微任务在浏览器和 node 环境执行顺序不一样
// 这个列子里面,包含了宏任务,微任务,分别看看浏览器和node 打印的结果
console.log(1)
// 栈
setTimeout(function(){
console.log(2)
// 微任务
Promise.resolve(100).then(function(){
console.log('promise')
})
})
// 栈
let promise = new Promise(function(resolve, reject){
console.log(7)
resolve(100)
}).then(function(data){
// 微任务
console.log(data)
})
// 栈
setTimeout(function(){
console.log(3)
})
console.log(5)
// 浏览器结果:1 7 5 100 2 promise 3
// node 结果: 1 7 5 100 2 3 promise
复制代码
浏览器和 node 环境执行顺序不一样,浏览器是先把一个栈以及栈中的微任务走完,才会走下一个栈。node 环境里面是把因此栈走完,才走微任务
《2》setTimeout setImmediate 都是宏任务,谁优先执行呢?
setTimeout(function(){
console.log('timeout')
})
setImmediate(function(){
console.log('setImmediate')
})
// 结果打印:timeout setImmediate
复制代码
setTimeout setImmediate 这两个取决于 node 的执行时间
《3》nextTick 和 then 都属于微任务,谁优先执行呢?
process.nextTick(function(){
console.log('nextTick')
})
Promise.resolve().then(function(){
console.log('then')
})
// 结果打印:nextTick then
// 再加一个宏任务呢
setImmediate(function(){
console.log('setImmediate')
})
// 结果打印:nextTick then setImmediate
复制代码
nextTick 会比 其余微任务、宏任务执行快
《4》i/o 文件操做(宏任务),搭配微任务,谁优先执行呢?
let fs = require('fs');
fs.readFile('./1/log',function(){
console.log('fs')
})
process.nextTick(function(){
console.log('text')
})
// 结果打印:text fs
复制代码
i/o 文件操做(宏任务), 若是有微任务,先执行微任务,在执行文件读取