node中的nextTick
wǎng luò shí huāng 2021-06-10
node
nextTick
主要是介绍了node中的node中的nextTick
# node中的nextTick
笔记在:https://lqyld.github.io/document/NodeJs/introduce/#%E4%BA%94-node%E4%B8%AD%E7%9A%84event-loop 这是别人的笔记 笔记很好基本随着珠峰的课程。来源于github:https://github.com/LQYld/lqyld.github.io
代码在:https://gitee.com/wangluoshihuang/zhufeng202103node/blob/master/3.node-core/1.js
nextTick:在node中是node自己实现的,不属于node中的EventLoop,优先级比promise更高。nextTick里面的代码被放在执行栈的底部——同步代码执行完后立即执行;执行优先级比eventLoop更高。
eventLoop里我们呢只需要关心:timers、poll、check、close callbacks这几个阶段。其他的阶段我们操作不了。
- 官网链接 (opens new window)
- timers:主要指时器
- 有一个现象就是:我们在代码里同时有setTimeout以及setImmediate,按照事件循环本应该是先执行timers再执行setImmediate;但是我们多次刷新之后,发现有那么一次是setImmediate先执行。为什么呢?很可能是代码执行的时候定时器还没有到时间,所以timer阶段就跳过去了没有执行,这个timer只有在下一次事件循环执行。
- 但是有一种情况,setImmediate和定时器的执行顺序是固定的:i/o里的setImmediate和定时器的执行顺序是固定的 (opens new window)。
- poll:指 I/O的回调函数
- poll会是一个等待的过程
- 当eventLoop走到这一步时,如果有异步操作时就会呈现一个等待的过程,直到到达异步后续的执行条件时eventLoop再往后走。
- poll阶段细节:
- 1.检测poll队列中是否为空,如果不为空则执行队列中的任务,知道超时或全部执行完毕
- 2.执行完毕后检测setImmediate队列是否为空,如果不为空则执行check阶段;如果为空则看有没有定时器,有的话则等待时间到达,时间达到后回到timer阶段。
- 3.等待时间到达时可能会出现新的callback,此时也在当前阶段被清空。
- 例如在等待setTimeout的同时,又执行了文件读取,那么等待时间达到后,定时器以及这个i/o回调函数都会被执行。
- 上面的执行过程代码参考:https://gitee.com/wangluoshihuang/zhufeng202103node/blob/master/3.node-core/1.js#L89
- 也就是说在poll阶段时代码的执行过程有2中:
- 第一种:poll阶段之后没有setImmediate,那么eventLoop就直接返回到timer阶段再执行。
- 第二种:poll阶段之后有setImmediate,那么eventLoop就继续往下走。
- 假如异步i/o之后紧挨着的是定时器,那么定时器和异步i/o都会在poll阶段呈现一个等的状态,谁先到达执行的条件谁就先执行。
- poll会是一个等待的过程
- check:指setImmediate()函数里的代码的。
- close callbacks:关闭的回调函数。