当前位置:首页 > node > 正文内容

nodejs 事件循环

自由小鸟9个月前 (11-01)node264

经常面试喜欢问js的事件循环和node的区别
node的比js的可要复杂一点
先说一下js的,我只说10版本之后的,就不包括浏览器环境一些api了

个人理解的分类为
js 整个脚本代码 全局代码
js 异步事件: 各种的回调函数

异步事件分为宏任务-微任务
宏任务:
异步事件 (例如鼠标点击、键盘按键) 级别高
setTimeOut setInterval 请求的回调
微任务:
promise then catch

整个流程代码是从上到下执行

举个白话的例子说明一下:
可以这么理解,执行顺序就像是考试做题,正常从上往下做,遇到不会的,难题(异步任务),拿两张新纸记录下来
稍难(微任务) 的一张,
特别难(宏任务) 的一张,
当前简单的做完了以后,拿过来稍难(微任务)得继续做,重复没有稍难的就拿过来特别难的,最终做完为止

就是在每一轮代码执行的过程最后都会把这一轮所产生的所有微任务执行完之后再进行下一轮开始
代码执行题可以看我文章
https://juejin.cn/post/7231484081367203897

好了我们说正题了—nodejs的事件循环题 6个阶段
1,timers(定时器)阶段:在这个阶段,执行所有的setTimeout和setInterval回调。
2,pending callbacks阶段:在此阶段,执行那些在事件循环的早期阶段注册的回调。
3,idle, prepare阶段:这是node内部执行阶段。
4,poll(轮询)阶段:此阶段主要负责检索新的I/O事件。
5,check(检查)阶段:此阶段在轮询阶段之后,如果在轮询阶段没有设置timer,且轮询队列不为空,event loop将同步执行queue里面的回调,直到轮询队列为空。如果设置了setImmeadiate,poll queue将进入check阶段;如果没设定setImmeadiate,则会阻塞在poll queue阶段。
6,close callbacks阶段:在此阶段,执行关闭回调。

其实我们最关注的还是 timers poll check

一直在poll队列等待

1,代码都是在调用栈执行, 如果时间到了把对应各队列的回调推入事件循环里




以上为了确定执行顺序可以改成下面这个写法

执行顺序是
从上到下
nextTick -》微任务 promise ->然后到事件循环(timer poll(这里处理I/O文件操作,所有操作完会回到这里等待) check)

更详细的可以看我的掘金https://juejin.cn/post/7296089060833853455

推荐博文
https://www.ruanyifeng.com/blog/2018/02/node-event-loop.html

版权声明:本文由Web学习之路发布,如需转载请注明出处。

本文链接:https://webge.net/?id=184

返回列表

上一篇:node中写接口常用到的sql语句

没有最新的文章了...

“nodejs 事件循环” 的相关文章

node exec 打开本地安装包

const exec = require('child_process').exec // 任何你期望执行的cmd命令,ls都可以 let cmdStr = './你的可执行程序名称 -p 需要输入密码的话' // 执行cmd命令的目录,如果使用cd x...

node 从0开始学习

1,新建一个文件夹,2, 进入文件夹内部,执行 npm init 一路回车3,创建index.js4,安装express及重要插件先来用express这个框架, 终端分别输入npm install express –save (注:–save是保存到项目中的意思)npm install body...

node.js学习记录

1,安装nodejs开发环境简单实现的石头剪刀布 console.log(process) //这个是node自带的 var playAction = process.argv[process.argv.length - 1] console.log(playAction) var ra...

vue3+nodejs项目记录

vue3+nodejs项目记录

新建文件目录app.vue代码 <template> <div class="demo"> <div class="text">Count: {{state.count}}</div>...

node中写接口常用到的sql语句

自己写接口不求人,node就很方便写接口,把自己写过的接口中用到的sql语句记录下来,方便日后查询 const sql = "insert into image set ?"; //一般没有传参数 const sql = "update image set...