首页 > 其他分享 >【个人前端笔记】Event loop和微任务与宏任务

【个人前端笔记】Event loop和微任务与宏任务

时间:2024-03-04 14:48:47浏览次数:34  
标签:poll 函数 check 任务 阶段 执行 Event loop

一、Eventloop
Eventloop是指在node.js的事件循环,不是在浏览器中

二、Eventloopd各个阶段

   ┌───────────────────────┐
┌─>│        timers         │     timers 阶段:这个阶段执行 setTimeout 和 setInterval 的回调函数。
│  └──────────┬────────────┘
│             │
│     process.nextTick()
│             │
│  ┌──────────┴────────────┐
│  │     I/O callbacks     │     I/O callbacks 阶段:不在 timers 阶段、close callbacks 阶段和 check 阶段这三个阶段执行的回调,都由此阶段负责,这几乎包含了所有回调函数。
│  └──────────┬────────────┘
│             │
│     process.nextTick()
│             │
│  ┌──────────┴────────────┐
│  │     idle, prepare     │     idle, prepare 阶段(译注:看起来是两个阶段,不过这不重要):event loop 内部使用的阶段(译注:我们不用关心这个阶段)
│  └──────────┬────────────┘      
│             │
│     process.nextTick()
│             │                   ┌───────────────┐
│  ┌──────────┴────────────┐      │   incoming:   │
│  │         poll          │<─────┤  connections, │     poll 阶段:获取新的 I/O 事件。在某些场景下 Node.js 会阻塞在这个阶段
│  └──────────┬────────────┘      │   data, etc.  │
│             │                   └───────────────┘
│     process.nextTick()
│             │
│  ┌──────────┴────────────┐      
│  │        check          │     check 阶段:执行 setImmediate() 的回调函数。
│  └──────────┬────────────┘
│             │
│     process.nextTick()
│             │
│  ┌──────────┴────────────┐
└──┤    close callbacks    │     close callbacks 阶段:执行关闭事件的回调函数,如 socket.on('close', fn) 里的 fn。
   └───────────────────────┘

以上这些阶段作为前端我们只看timers、poll、check即可

1.poll阶段
当事件循环在poll阶段时,它会在此停留一段事件,具体等多久不知道,
停留这段期间它会去检查timer和check是否有事件需要执行,如果没有就等,有就会尽快进入有事件的阶段去执行事件

2.check阶段
node.js有一个函数,叫setImmediate,这个函数的执行时机就是在check阶段里
如果在poll阶段轮询发现check有事件需要执行,那么poll会尽快来到该阶段执行事件

3.timers阶段
timers阶段会执行 setTimeout 和 setInterval 的回调函数

面试题1:一段代码中有settimeout事件执行时间设置为0和setImmediate,请问哪个事件先执行
答:不确定,但大概率会执行setImmediate,因为事件循环很大概率会在poll阶段停留,如果此时同时有该两个事件,会先去check阶段,再去timers阶段

三、nexttick函数
nexttick函数会在每个阶段结束之前执行,实际上nexttick并不在Eventloop当中

四、宏任务和微任务
在chrome里,只有微任务和宏任务
可以把微任务当做是“马上”
宏任务当做是“一会儿”

宏任务中出先微任务,先做微任务,再做宏任务

宏任务就是settimeout和setimmeate函数
微任务就是promise后面的.then以及.catch

五、await转换成promise

题目

async function async1() {
     console.log(1);
     await async2();
     console.log(2);
 }
async function async2() {
    console.log(3)
}

async1();

new Promise(function (resolve) {
    console.log(4);
    resolve();
}).then(function () {
    console.log(5);
});

分析
1.前两个都是声明async函数,略过
2.执行async1函数,然后打印出1。
3.await async2(),将其转换成promise

promise.resolve(async2).then(() => console.log(2))

所以先打印出3,然后将await async2()下面以后的函数放进微任务队列里

4.执行new Promise,将promise函数里面的回调执行,然后then函数里面的回调放进微任务
5.主要的js代码执行完,开始执行微任务
6.之前await async2()下面的代码先放进微任务队列里,所以先打印出3
7.然后执行下面的then函数里面的回调,打印出5

答案:1 3 4 2 5

标签:poll,函数,check,任务,阶段,执行,Event,loop
From: https://www.cnblogs.com/icerain-black/p/18051748

相关文章

  • 【个人前端笔记】手写EventHub
    一、EventHubEventHub是对发布-订阅模式的一种实现。它是一种集中式事件处理机制,允许不同的模块之间进行彼此通信而又不需要相互依赖,达到一种解耦的目的。二、EventHub优缺点优点:1.通过EventHub实现所有模块之间通信的技术。在vue2中可以用事件总线实现任意组件间传递数据2.E......
  • 计算机打开图像时进行了那些任务?
    打开.png格式的图像时,计算机会进行以下步骤:读取文件头:计算机首先读取图像文件的文件头,确定这是一个.png格式的文件。解析图像数据:计算机会解析图像数据块,这些数据块包含了图像的像素信息、色彩类型、图像尺寸等。这些数据块的格式和内容在PNG规范中有详细定义。解......
  • 并发编程之Gevent模块
    Gevent的介绍greenlet已经实现了协程,但是这个还要人工切换,这里介绍一个比greenlet更强大而且能够自动切换任务的第三方库,那就是gevent。gevent内部封装的greenlet,其原理是当一个greenlet遇到IO操作时,,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回......
  • 自动重启Jellyfin Windows服务的任务设置方法
    在日常使用计算机的过程中,有时我们需要定期重启某些程序或服务以确保其正常运行。本文将介绍如何设置一个自动任务,在每天指定的时间,关闭并重新启动名为Jellyfin.Windows.Tray.exe的进程,以保证JellyfinWindows服务的顺利运行。步骤:创建批处理文件:打开记事本或其他文本编辑器,在......
  • Android 13接大屏时底下显示任务栏以及虚拟按键靠右问题
    Android13大屏显示时,界面底下显示任务栏,返回、home,recent按键显示会靠右。和Android12类似,但跟以往的Android系统不一样。之前Android12上面修改过这个显示:Android12大屏时底下显示任务栏以及虚拟按键靠右问题_androidtaskbar_HH同学的博客-CSDN博客但是,Android13上面又不......
  • 解决celery与django结合后,分别启动celery和django的进程同时调用定时任务的问题
     django中引入celery后发现在代码中写如下这样的定时任务,启动celery和django的工程后,他们都会调用这个定时任务导致,任务有的时候会冲突出现奇怪的问题。如何解决请继续看。scheduler=BackgroundScheduler()scheduler.add_job(testFunc,'interval',seconds=60)scheduler.......
  • SpringBoot定时任务:使用shedlock解决SpringBoot分布式定时任务
    第一步:引入shedlock包maven中pom文件添加如下配置:<dependency><groupId>net.javacrumbs.shedlock</groupId><artifactId>shedlock-spring</artifactId><version>4.33.0</version>使用其他版本</dependency>第二步:添加shedlock-p......
  • 【C++】Mat和Pat希望邀请他们的朋友来参加派对。他们要编写一个程序完成下面的任务。
    Mat和Pat希望邀请他们的朋友来参加派对。他们要编写一个程序完成下面的任务。让Mat输入他朋友的姓名列表。姓名存储在一个容器中,然后按排列后的顺序显示出来。让Pat输入她朋友的姓名列表。姓名存储在另一个容器中,然后按排列后的顺序显示出来。创建第三个容器,将两个列表合并,删除重......
  • 定时任务
    配置接口packagetest;importjava.util.concurrent.TimeUnit;publicinterfaceIScheduledCfg{StringgetName();intgetCount();longgetInitialDelay();longgetCycleTime();TimeUnitgetTimeUnit();}配置类packagetest;importlom......
  • .net 应用程序 生成Docker映像时 dotnet restore找不到自定义源的包的问题,ContainerBu
    一、问题:我们在.net应用中生成Docker映像时,会出现ContainerBuildAndLaunch任务意外失败的问题。 查看输出窗口发现,是执行dotnetrestore时,找不到包的问题,因为我的这些包是在自己的私有源上二、解决方案:在Dockerfile文件中,在执行dotnetrestore前一行添加nuget私有源就行......