当前位置: 首页 > 后端技术 > Node.js

Node.js学习总结-----事件周期

时间:2023-04-03 22:42:34 Node.js

1.引入事件循环机制是Node.js最重要的部分之一。为什么他如此重要?因为它解释了为什么Node.js(单线程)可以异步不阻塞IO。Node.js可以做到这一点,离不开调用栈、消息队列和ES6工作队列。2、调用栈会在javascript脚本执行时顺序执行,执行完的函数会依次入栈,执行完退出栈。示例如下:test1(){console.log('test1');}test2(){console.log('test2');}test3(){console.log('test3start');测试1();测试2();console.log('test3结束');}test3();执行这个脚本会得到如下结果:test3starttest1test2test3end调用栈按如下顺序调用:1.调用test3()|__test3__|2。执行test3()|__console.log("test3start")__||__________test3___________|3.test1()压入栈并执行|__console.log("test1")__||______test1___________||______test3___________|test1返回执行后的栈4.test2()压入栈并执行|__console.log("test2")__||______test2___________||______test3___________|test2执行后返回5.继续执行test3|__console.log("test3end")__||__________test3___________|test3执行后回栈3.如果消息队列只使用一个调用栈,那么当一个函数执行时间较长时,这个函数会阻塞后续需要调用的函数。因此,将那些阻塞其他正常功能执行的功能(用户发起的事件)放在消息队列中,例如定时器、点击或键盘事件、Dom事件。示例:test1(){console.log('test1');}test2(){console.log('test2');}test3(){setTimeOut(()=>console.log('last'),0);测试1();测试2();console.log('test3结束');}test3();执行这个脚本会得到如下结果:test1test2test3endlast执行过程如下:1.执行test3()入栈|__test3__|2。执行setTimeOut,放入队列栈:|__setTimeOut(xxx)__||_____test3_________|Queue:|console.log('last')|3.test1()入栈执行|__console.log("test1")__||______test1___________||______test3___________|test1后回栈4.test2()入栈执行|__console.log("test2")__||______test2_________||______test3___________|test2回栈执行完5.继续执行test3|__console.log("test3end")__||__________test3___________|test3执行后回栈6.栈为空后执行消息队列内容队列:|控制台日志('最后')|这个线程会先执行call的Stack,heart会在callstack为空后执行消息队列中的内容。4.ES6workqueueECMAScript2015/ES6引入的workqueue概念,这个workqueue将promise放入其中。消息队列和工作队列之间的关系可以比作在游乐园里坐过山车:消息队列把你放在队列的后面,在其他人后面,轮到你要等,而工作队列很快就过去了这样您就可以在完成最后一次骑行后立即进行另一次骑行。示例:test1(){console.log('test1');}test2(){console.log('test2');}test3(){setTimeOut(()=>console.log('last'),0);newPromise((resolve,reject)=>{resole('beforelast');}).then(res=>console.log(res));测试1();测试2();console.log('test3结束');}test3();执行这个脚本会得到如下结果:test1test2test3endbeforelastlast执行过程如下:1、执行test3(),入栈|__test3__|2。执行setTimeOut,放入消息队列栈:|__setTimeOut(xxx)__||_____test3_________|消息队列:|console.log('last')|3。执行promise并合并到工作队列栈中:|__resole(xxx)_______||_____test3_________|work列:|console.log('beforelast')|4.test1()入栈执行|__console.log("test1")__||______test1___________||______test3___________|test1执行完后压回栈stack5.test2()入栈执行|__console.log("test2")__||______test2___________||______test3___________|test2backstack6.继续执行test3|__console.log("test3end")__||__________test3__________|test3执行完后栈回退7.栈空后执行消息队列内容队列:|console.log('last')|8。栈为空后执行工作队列内容队列:|console.log('之前')|