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

每日灵魂题——nodejs事件循环

时间:2023-04-03 19:34:17 Node.js

事件循环背景nodejs是基于V8引擎的JavaScript运行时nodejs是基于libuv实现异步非阻塞I/O操作。事件循环是nodejs处理非阻塞I/O操作的机制。正常的js执行顺序是:1.主线程执行栈中的所有任务都执行完。(同步任务)2.查看microtask队列,2.1process.nextTick优先级最高,总是先执行2.2Promise的then回调;await后的内容3.查看macrotask队列,提取一个task压入执行栈,执行implement。宏任务队列,即事件循环,分为6个阶段:1.定时器阶段(setTimeout,setInterval)2.I/O事件回调阶段(I/Ocallbacks)3.空闲阶段(idle,prepare):仅在系统内部使用4.轮询阶段(poll)5.检查阶段(check):setImmediate()6.关闭回调阶段:执行关闭事件回调Example1console.log('main');setImmediate(function(){console.log('setImmediate');});newPromise(function(resolve,reject){resolve();}).then(function(){console.log('promise.then');});1.控制台。日志('主要');加入同步队列2.setImmediate(function(){console.log('setImmediate');});在宏任务中加入检查阶段(check)3.返回promise并加入微任务队列中例2asyncfunctionasync1(){console.log('async1start')awaitasync2()console.log('async1end')}asyncfunctionasync2(){console.log('async2')}console.log('scriptstart')//1.加入同步队列setTimeout(function(){//2.加入定时器阶段宏任务console.log('setTimeout0')},0)setTimeout(function(){//3.添加宏任务的定时器阶段console.log('setTimeout2')},300)setImmediate(()=>console.log('setImmediate'));//4.添加宏任务的检查阶段process.nextTick(()=>console.log('nextTick1'));//5.加入微任务队列async1();//6。Executeasync1//Executeasync2inasync1//将awaitasync2()后的内容添加到microtask队列进程中.nextTick(()=>console.log('nextTick2'));//7.加入microtask队列进程。nextTick优先级最高所以advancenewPromise(function(resolve){console.log('promise1')//7.添加同步任务resolve();console.log('promise2')//8.添加同步任务}).then(function(){console.log('promise3')//9.添加微任务})console.log('scriptend')//10.添加同步任务结果如下scriptstartasync1startasync2promise1promise2scriptendnextTick1nextTick2async1endpromise3setTimeout0setImmediatesetTimeout2