浏览器的事件循环和浏览器的事件循环的区别是什么
- JS是单线程的
- 浏览器中JS执行和DOM渲染公用一个线程
- 异步
异步中又有宏任务和微任务
- 宏任务 setTimtout setInterval
- 微任务 Promise async await
- (先执行同步任务后执行异步任务)微任务在下一轮DOM渲染之前 执行,宏任务在渲染之后执行
在执行完同步任务之后 在遇到异步事件如ajax settimaout等之后 会先将这些事件添加到对应的任务执行队列中,之后会触发事件循环机制 会首先对于添加到微任务队列中的部分进行执行,再对于宏任务队列中的函数进行执行
并且会在一定时间中进行询问查看(循环)是否队列中有未完成的任务---因为例如ajax的请求返回之后就会需要一定的执行时间
Nodejs 异步
- Nodejs 同样使用ES语法,也是单线程,也需要异步
- 异步任务分为:宏任务+微任务
- 但是其宏任务和微任务 分为不同类型,有不同的优先级
宏任务:
- Timer -setTimeout
- I/O callbacks -处理网络,流,TCP的错误回调
- Idle,prepare- 闲置状态(nodejs内部使用
- Poll 轮询 -执行poll中的I/O队列
- Check 检查- 存储 setImmediate回调
- Close callbacks -关闭回调 如 socket.on('close')
微任务:
- promise,async/await,process.nextTick(最高)---推荐使用setImmediate代替 process.nextTIck
- 执行同步代码
- 执行微任务
- 按顺序执行6个类型的宏任务(每个宏任务执行之前都确保上一级的微任务已经执行完