首页 > 其他分享 >宏任务与微任务

宏任务与微任务

时间:2022-10-16 01:55:29浏览次数:99  
标签:异步 同步 队列 主线 任务 执行

原文:做一些动图,学习一下EventLoop (https://juejin.cn/post/6969028296893792286)

一、任务队列

  JavaScript 是单线程执行的语言, 在同一时间只能干一件事情。如果前面的任务很耗时后面的任务就会一直等待,为了解决这个问题,js中出现了同步任务和异步任务

1.1 同步任务

  在主线程上排队执行的任务只有前面执行完毕才能执行下一个任务,形成一个执行栈

1.2 异步任务

  不进入主线程,而是进入任务队列,只有当主线程的任务执行完毕,才会从任务队列中拿任务到主线程来执行。由于主线程不断循环 获取任务 -> 执行任务 -> 再次获取任务 -> 再次执行任务 ,所以这种机制被叫做 事件循环

异步任务执行顺序图解

二、宏任务和微任务

  在任务队列中其实还分为宏任务队列和微任务队列,里面存放的就是宏任务和微任务

  宏任务和微任务都是异步任务, 这两者的区别就是它们的执行顺序。

  在同步任务中, 任务都是讲究按照代码顺序执行的, 而异步任务也是需要按照顺序执行的; 队列的属性就说先进先出, 因此异步任务会按照进入队列的顺序以此执行。

  这就解释了为什么下列代码中,为什么后面的定时器比前面的定时器先执行。因为后者的定时器先推进宏任务队列,而前者会在到时间后再被推进宏任务队列

setTimeout(() => {
    console.log('a');
}, 10000);

setTimeout(() => {
    console.log('b');
}, 100);

2.1 宏任务

  宏任务包括:script(整体代码), setTimeout, setInterval, Ajax, DOM事件, requestAnimationFrame ( 只存在浏览器中 ), I/O, SetImmediate( node )

2.2 微任务

  微任务包括:Promise.then, async/await, Object.observe ( 已废弃 ), MutationObserver ( HTML5新特性, 只存在浏览器中 ), process.nextTick ( node )

三、完整的执行顺序

  1. 从上往下执行所有的同步代码
  2. 在执行过程中遇到宏任务就存放到宏任务队列中, 遇到微任务就存放到微任务队列中
  3. 当所有的同步任务执行完毕, 就执行微任务队列中满足需求的所有回调
  4. 当微任务队列中所有满足需求的回调执行完毕后, 就执行宏任务队列中满足需求的所有回调

3.1 注意

  每执行完一个宏任务都会立即检查微任务列表有没有清空, 如果没有就立即清空。
  Promise里的是同步任务,立即执行

标签:异步,同步,队列,主线,任务,执行
From: https://www.cnblogs.com/bkzj/p/16795529.html

相关文章

  • 【第五篇】Camunda系列-任务分配
    任务分配1.固定分配  在指派​​用户任务​​的审批人时。我们是直接指派的固定账号。但是为了保证流程设计审批的灵活性。我们需要各种不同的分配方式,所以这节我们就详细......
  • linux进程及计划任务管理
    程序和进程的关系1.程序保存在硬盘,光盘等介质中的可执行代码和数据文件中静态保存的代码2.进程在cpu及内存中运行的程序代码动态执行的代码父,子进程每个程序可以创......
  • xxl-Job分布式任务调度
    一、分布式任务调度产品了解:1)TBSchedule:淘宝推出的一款非常优秀的高性能分布式调度框架,目前被应用于阿里、京东、支付宝、国美等很多互联网企业的流程调度系统中。但是......
  • 实验任务
    实验任务1.1#include<stdio.h>#include<stdlib.h>intmain(){   printf("o\n");   printf("<H>\n");   printf("II\n");   printf("o\n");......
  • 使用Windows命令行打开任务计划程序
    1.点击“Win+R”,打开运行对话框。2.输入“CMD”,然后点击“确定”按钮。3.输入“taskschd.msc”或“taskschd”命令,然后点击回车。4.可以看到任务计划程序已经打开。......
  • SpringBoot(三) - Slf4j+logback 日志,异步请求,定时任务
    1、Slf4j+logback日志SpringBoot框架的默认日志实现:slf4j+logback;默认日志级别:info,对应了实际生产环境日志级别;1.1日志级别#常见的日志框架中,日志级别都包含五种,......
  • 任务一
    #define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<math.h>intmain(){doublec,f;while(scanf("%lf",&c)!=EOF){f=9*c......
  • 教你优雅的实现 SpringBoot 并行任务
    SpringBoot的定时任务:第一种:把参数配置到.properties文件中:代码:packagecom.accord.task;importjava.text.SimpleDateFormat;importjava.util.Date;importorg.spring......
  • Spark任务写数据到s3,默认单线程移动数据,执行时间很长
     一、场景目前使用s3替代hdfs作为hive表数据存储,使用sparksqlinsert数据到hive表,发现一个简单的查询+插入任务,查询+insert的动作显示已经执行完,任务还在跑,直到......
  • 【论文阅读-提示学习】Prompt在自然语言处理任务中的迁移性
    Prompttuning(PT)只需要调整少量参数即可实现与全参数微调相当的性能,是一种使用超大规模PLM的参数高效方法。然而,与微调相比PT需要更多训练时间。提示学习与全参数微......