什么是evnet-loop
Event Loop是一个程序结构,用于等待和发送消息和事件
简单说,就是在程序中设置两个线程:一个负责程序本身的运行,称为"主线程";另一个负责主线程与其他进程(主要是各种I/O操作)的通信,被称为"Event Loop线程"(可以译为"消息线程")。
JavaScript 是一门单线程语言,
同一时间只能做一件事情
原因:为了避免DOM渲染冲突, js有修改dom的权力,浏览器也需要渲染dom,js也需要修改dom 多行js之间不能同时执行会导致渲染dom的冲突 js和浏览器也不能同时执行**
解决方案(异步)
通俗的说法是异步,其实实现方式是event-loop(事件轮询);同步代码,直接执行;异步函数先放在异步函数的的队列中(先把函数挪到一个地方取,先不管它)待同步函数执行完毕,轮询执行异步队列的函数
案例1
// 异步函数不能够直接执行了,先放在异步队列中
setTimeout(function(){
console.log(100)
})
// 同步直接执行
console.log(200)
//主进程
console.log(200)
//异步队列
function(){
console.log(100)
}
// 异步函数把function(){console.log(100)}放入异步函数的队列中
//console.log(200); // 200
//执行完之后打印出200 ,事件轮询查看异步队列中是否有函数;
//把这个函数立刻放到主线程中function(){console.log(100)}
//然后再执行
复制代码
案例2
//js引擎会一直轮询的监视异步队列中有没有函数
//100ms之后被放入function(){console.log(1)}
//立刻被执行
setTimeout(function(){
console.log(1)
}, 100)
setTimeout(function(){
console.log(2)
})
console.log(3)
//主进程
console.log(3)
//异步队列
function(){
console.log(2)
}
// 100ms之后执行
function(){
console.log(1)
}
复制代码
总结
- 事件轮询,JS实现异步的具体解决方案
- 同步代码,直接执行
- 异步函数先放在异步队列中
- 待同步流函数执行完毕,轮询执行异步队列的函数