微任务和宏任务
浏览器执行环境下的js异步代码会被分为宏任务和微任务
- 宏任务:setTimeout\interval\immediate
- 微任务:Promise、pmutationObsever(监听节点变化)、process.nextTick
浏览器事件环总流程
- 遇到宏任务或者微任务会将这些任务放到各自的宏任务队列和微任务队列中
- 宏任务和微任务遵循先进先出的原则
1、代码从上往下执行
2、遇到宏任务存储到宏任务队列中,遇到微任务存储到微任务队列中
3、完成同步代码后立即找微任务队列,完成微任务队列后再执行宏任务队列
4、每次执行完一个宏任务队列后都会亲清空微任务队列
nodejs中的EventLoop
nodejs事件环和浏览器事件环的区别
1、nodejs有6个任务队列
- timer:settimeout/interval
- pending:系统操作的回调
- poll:I/O相关的回调,比如事件写入写出事件后的回调(除了close队列、定时器、setImmediate之外的基本上都是poll队列)
- check:setImmediate的回调函数
- close:close时间的回调,比如socketioll
2、nodejs队列没有微任务队列
3、nodejs中只有同步代码执行完成和队列任务切换擦回去清空微任务代码
4、nodejs中如果微任务同时满足条件那么根据优先级来,Promise的优先级小于process.nextTick
EventLoop执行队列
执行完所有的同步代码后会清空微任务,执行timer(这里pending和close队列暂不做考虑),清空微任务,执行poll队列,执行微任务,然后看check有没有任务有就切换,没有就看timer有没有任务,有就切,没有就停在poll中。
面试题
setTimeOut和setTmmediate加入队列后的结果是随街由于node存在定时的误差,但是如果将这俩个事件用readFile包裹那么就会执行,immediate再执行timeout