浏览器的事件循环机制
1.脚本就是一个任务宏任务
2.脚本代码执行然后:js代码是单线程的,在主线程中执行所有的js任务
2.js任务可能调用底层提供异步任务的api:网络任务 promsie 计时器
3. 遇到了异步任务时 就把微任务或者宏任务 添加到底层的子线程中执行
(1)先执行微任务(比如promise)
(2)微任务执行完毕时会触发微任务的回调函数(就是主线程绑定的回调)
(3)如果微任务执行了 就执行宏任务
(4)但是不管是微任务还是宏任务都是异步的也就是 虽然微任务先执行宏任务后执行 如果微任务执行的时间久 宏任务执行的时间短,那就是宏任务先调主线程绑定的回调
4.如果执行完微任务后 又去扫描时发现里面有宏/微任务 又按照这个顺来执行
这就是浏览器的事件循环
node.js的事件循环机制
eventLoop 事件循环池
node会把异步任务添加到事件循环池中去执行(子线程)
fs.readFile() //c/c++ 自己引擎 (硬盘) 所以文件请求也是异步操作
promise // v8
http.createServer(cb) cb
事件循环池就是node的底层代码: 封装的v8引擎 自己的一些异步代码(c/c++)
谁的异步业务执行完毕 事件循环池中标记事件完成然后回到主线程调用回调函数
//面试:node单线程还是多线程?
如果是主线程的js代码 那必然是单线程 因为js语法是一个单线语法
如果是调用了node提供的或者js提供的异步任务就会在事件循环池中调用对应的引擎 开始子线程异步执行任务
异步的体现: 回调函数