Event Loop是计算机的一种运行机制,js就采用这一机制来解决单线程带来的问题。
运行以后的程序叫做进程,一个进程一次只能执行一个任务
如果有很多任务要执行,解决办法:
- 排队。等前面的任务执行完再执行后面的
- 新建进程。为每一个任务新建一个进程
- 新建线程。新建进程太浪费资源,一个进程包含多个线程,由线程去完成任务
1 同步模式或者阻塞模式
绿色的部分代表运行,红色的部分代表等待
2 多线程
这样会浪费多倍的资源,也会闲置多倍资源
3 Event Loop
他是在程序中运行两个线程,一个负责程序本身的运行,称为 :主线程 ;另一个线程负责主线程与其他进程的通信被称为Event Loop 消息线程。
原理:
异步模式或非堵塞模式:
绿色运行,橙色空闲,每当遇到I/O ,主线程就让Event Loop去通知相应的I/O程序,然后接着往下运行,不存在红色的等待时间,等I/O程序完成操作,Event Loop把结果返回给主线程,主线程调用事先设定好的回调函数完成整个任务。
小试牛刀:
1
setTimeout(() => {
console.log("setTimeout1")
Promise.resolve().then(data => {
console.log('222')
})
})
setTimeout(() =>{
console.log("setTimeout2")
})
Promise.resolve().then(data => {
console.log('111')
})
输出结果为:
111
setTimeout1
222
setTimeout2
2
console.log('script start')
setTimeout(()=>{
console.log('setTimeout --- 0')
},0)
setTimeout(()=>{
console.log('setTimeout --- 200')
setTimeout(()=>{
console.log('inner-setTimeout --- 0')
})
Promise.resolve().then(function(){
console.log('promise5')
})
},200)
Promise.resolve().then(function(){
console.log('promise1')
}).then(function(){
console.log('promise2')
})
Promise.resolve().then(function(){
console.log('promise3')
})
console.log('script end')
输出结果为:
script start
script end
promise1
promise3
promise2
setTimeout—0
setTimeout—200
promise5
inner-setTimeout—0