js中的微任务和宏任务,附面试题

2023-11-14

因为javascript是一门单线程语言,所以代码的解析执行都要以自上而下的执行,直到任务队列(task queue)的出现,js开始有了异步任务,当一段代码需要稍后执行时,便可以使用异步方案(setTimeout、setInterval、Poromis、Axios、Dom事件)来使指定操作添加到异步任务中。

代码执行流程: 主线程 => 微任务 => 宏任务

MDN

JavaScript 本质上是一门单线程语言。对于在它被设计出来的那个年代来说,这样的设计是一个很好的选择。那个时候的人们很少有多处理器计算机,并且当时也只是打算用 JavaScript 来编写少量的代码。

当然,随着时间的流逝,电脑的性能得到了飞速的提升。JavaScript 也变成了众多流行语言中的一员。许多非常受欢迎的应用或多或少都有 JavaScript 的影子。为此,找到一种可以突破传统单线程语言限制的方法变得很有必要。

自从 (setTimeout() 和 setInterval()) 加入到 Web API 后,浏览器提供的 JavaScript 环境就已经逐渐开始包含了任务安排、多线程应用开发等强大的特性。了解 JavaScript 运行时是如何安排和运行代码的对了解 queueMicrotask() 会非常有作用。

1. 面试题(答案在最后)

setTimeout(function () {
  console.log("setTimeout1");
  new Promise(function (resolve) {
    resolve();
  }).then(function () {
    new Promise(function (resolve) {
      resolve();
    }).then(function () {
      console.log("then4");
    });
    console.log("then2");
  });
});

new Promise(function (resolve) {
  console.log("promise1");
  resolve();
}).then(function () {
  console.log("then1");
});

setTimeout(function () {
  console.log("setTimeout2");
});

console.log(2);

queueMicrotask(() => {
  console.log("queueMicrotask1")
});

new Promise(function (resolve) {
  resolve();
}).then(function () {
  console.log("then3");
});

 

2. 面试题

async function async1 () {
  console.log('async1 start')
  await async2();
  console.log('async1 end')
}

async function async2 () {
  console.log('async2')
}

console.log('script start')

setTimeout(function () {
  console.log('setTimeout')
}, 0)
 
async1();
 
new Promise (function (resolve) {
  console.log('promise1')
  resolve();
}).then (function () {
  console.log('promise2')
})

console.log('script end')

 

3. 答案

// promise1
// 2
// then1
// queueMicrotask1
// then3
// setTimeout1
// then2
// then4
// setTimeout2
// script start
// async1 start
// async2
// promise1
// script end
// async1 end
// promise2
// setTimeout

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

js中的微任务和宏任务,附面试题 的相关文章

  • 主干关系事件未触发?

    class TheModel extends Backbone RelationalModel relations type Backbone HasMany key subModels relatedModel SubModel coll
  • 请解释与 Google Chrome 扩展程序的后台通信

    我已经阅读并重新阅读了此页面 并运行了示例 http code google com chrome extensions background pages html http code google com chrome extension
  • 从 x,y 屏幕空间坐标查找 2D 等距网格上的列、行(将方程转换为函数)

    我试图在屏幕空间点 x y 的二维等距网格中找到行 列 现在我几乎知道我需要做什么 即找到上图中红色向量的长度 然后将其与表示网格边界的向量的长度 由黑色向量表示 进行比较 现在我在数学堆栈交换中寻求帮助 以获得用于计算点 x y 与黑色边
  • 限制文本区域中每行的字符数

    我整个周末都在寻找解决这个难题的方法 但尚未找到一个可以正常工作的解决方案 我想要实现的是限制文本区域中每行的字符数 不是相同地限制它们 而是我选择的每行不同的字符数 例如 我只想在我的文本区域中包含 4 行 第 1 2 和 3 行将限制为
  • ant-d upload中如何为removeFile添加PopConfirm一个图片文件

    我正在使用 Ant d Upload 通过本地系统上传文件 然后单击文件预览图像上的删除图标 图像文件将被删除 我想添加一个弹出确认 所以我尝试在 onRemovefunction 中添加确认作为承诺但它不起作用 它在浏览器中显示警报 on
  • 如何通过 HTML 按钮播放声音

    我目前通过网站播放音乐的方法是通过 HTML 音频标签 不过我希望能够通过 HTML 按钮来播放它 该按钮应该能够在播放和停止之间切换音乐 我在 JSFiddle 创建了一个示例 但不知道如何实现它 有人可以告诉我如何使用我的 JSFidd
  • 计算Javascript中两次点击之间的时间

    我想用 javascript 计算属性的两次点击之间的时间 但我不知道如何 例如 a href click here a 如果用户单击多次 假设 5 秒内 我想显示警报 如果有帮助的话我正在使用 jQuery 我对 javascript 不
  • 禁用 JavaScript 中的右键单击

    当我尝试禁用右键单击时 它不起作用 我尝试使用下面的代码 document onclick function e console log e button if e button 2 e preventDefault return fals
  • 响应式网格布局框架[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 保存/导出Chrome的JavaScript控制台输入历史记录

    无论如何 我可以保存或导出 JavaScript 控制台的历史记录吗 input 控制台历史记录 在 Google Chrome 中 我不想保存输出或错误 因此将鼠标悬停在控制台框上 右键单击并选择Save as 不是解决方案 我不想每次都
  • JavaScript 动画平滑滚动

    默认情况下 当您有这样的片段链接时 a href some url some fragment some text a 浏览器立即向下滚动到该片段 我该如何编程才能使用标准 JS 顺利地向下移动到该片段 这是一个例子 Example htt
  • 用数组反向查找对象

    假设我有一个这样的对象 resourceMap a 0 1 2 3 4 5 6 7 8 9 10 b 11 12 c 21 23 d 54 55 56 57 510 确定是否的最佳方法是什么resourceId 21将会 c 我们不知道钥匙
  • jQuery 选择器:为什么 $("#id").find("p") 比 $("#id p") 更快

    该页面的作者 http 24ways org 2011 your jquery now with less suck http 24ways org 2011 your jquery now with less suck断言 jQuery
  • 如何滚动到div内的元素?

    我有一个滚动的div我想在点击它时发生一个事件 它会强制执行此操作div滚动以查看内部元素 我写的JavasCript是这样的 document getElementById chr scrollIntoView true 但这会在滚动时滚
  • 从多维无穷大数组中删除数组元素

    我想删除一个特定元素 例如 我想删除元素id 76在下面的数组中 而且 数组可以无限地组合在一起 这里的问题是我无法刷新页面 因为我使用 Vue js 进行即时操作 如果我能做到这一点 我的下一个问题可能是如何在我现在想要的地方添加一个元素
  • ng-model 和值组合不适用于输入文本框

    我有两个输入文本框 我需要组合在两个文本框中输入的值并将其显示在第三个文本框中 如果我只使用value在第三个文本框中 Box 1
  • 如何获取使用 .map 渲染的第一个元素的 ref?

    我需要在几行中显示视频 卡片 的缩略图 并重点关注第一个缩略图 我使用嵌套地图进行了显示 该代码基本上迭代视频数组并返回多行视频 我们如何关注第一个渲染的元素 我认为我们需要获得第一个要聚焦的元素的引用 但是我们如何在这里设置 ref 并在
  • React Native - 跨屏幕传递数据

    我遇到了一些麻烦react native应用程序 我不知道如何跨屏幕传递数据 我意识到还有其他类似的问题在 SO 上得到了回答 但是这些解决方案对我来说不起作用 我正在使用StackNavigator 这是我的设置App js file e
  • 在javascript中动态生成行?

    我是 javascript 新手 我想在按下 Tab 时动态生成行 并希望获取在动态生成的行中输入的值 以便我可以在 servlet 代码中使用这些值 这是我的html
  • Bootstrap 3 / 显示模式不适用于 javascript 方式

    我用Modal http getbootstrap com javascript modalsBootstrap 3 0 的功能 我有这个代码 a href myNestedContent Open the modal containing

随机推荐

  • TCP为什么需要三次握手进行连接,二次或四次不可以吗?

    一 三次握手的作用 为了确认双方具有接收和发送的能力 二 三次握手的原因 1 可以阻止重复历史连接的初始化 主要原因 2 可以同步双方的初始序列号 3 可以避免资源的浪费 三 分析原因 1 为了防止旧的重复连接初始化造成混乱 当客户端发送了
  • 嵌入式软件中如何排查bug?

    明确Bug现象 要准确描述Bug出现的场景 现象 能复现就最好 查看日志信息 嵌入式系统日志可以帮助定位问题 看是否有报错 异常信息 用仿真工具调试 许多嵌入式芯片都有相应的仿真调试工具 可以在仿真环境下单步跟踪 查看变量值等 加打印调试
  • C# DataSet和DataTable:将查询结果保存到DataSet或DataTable中

    在执行对表中数据的查询时还能将数据保存到 DataSet 中 但需要借助 DataAdapter 类来实现 在实际应用中 DataAdapter 与 DataSet 是在查询操作中使用最多的类 此外 还可以通过 DataSet 实现对表中数
  • android pdf框架

    系列文章目录 第一章 android pdf框架 文章目录 系列文章目录 前言 一 主流pdf解析库有哪些 二 对比与使用 1 库对比 2 使用方式 总结 前言 pdf已经使用很普遍了 android上的好用的pdf工具也有不少 个人更经常
  • 倪文迪陪你学蓝桥杯2021寒假每日一题:(2017省赛A第1、2题)

    2021年寒假每日一题 2017 2019年的省赛真题 本文内容由倪文迪 华东理工大学计算机系软件192班 和罗勇军老师提供 文章目录 一 2017年蓝桥杯软件类 C语言大学A组 1 迷宫 2 跳蚱蜢 2 1 建模 2 2 判重 2 3 m
  • 罗技MX Keys从蓝牙连接切换为优联(无线接收器)连接

    不知道什么原因用最近MX Keys蓝牙连接mac怪卡的 按一个键按四五下电脑上才有反应 于是还是想用无线接收器连接来控制电脑 按照壳子上按fn o来切换好像不太管用 于是试了很久 最后用罗技自家的键盘管理软件切换上了 先下一个Logi Op
  • 链表与约瑟夫环 - JavaScript版

    前言 在很多编程语言中 数组需要预先给定一个长度 添加新的元素很难 而且添加 删除等操作也比较烦 需要循环操作 JavaScript提供了push 和splice 等函数来解决这类问题 注意 在js中数组是对象 Object js没有内置链
  • Linux系统调优 之 《OpenStack平台调度策略优化》

    目录 1 规划节点 2 基础准备 案例实施 1 OpenStack平台报错分析 2 解决策略 1 规划节点 根据云平台分配的主机 节点规划见表1 表1 节点规划 IP 主机名 节点 192 168 200 11 controller 控制节
  • delphi ado 动态连接数据库

    unit Unit1 interface uses Windows Messages SysUtils Variants Classes Graphics Controls Forms Dialogs StdCtrls DB ADODB E
  • Contains Duplicate III

    Given an array of integers find out whether there are two distinct indices i and j in the array such that the difference
  • 常用问题网址

    https www leonelngande com fetching the current route fragment in angular 7 RxJS https github com manojjha86 complete an
  • Router-Link详解

  • 文件(或文件夹)的复制(Java)

    将源文件 或目录 复制到另一个目录里 三种方法 1 最普通的方法 主要用File类中的方法和IO流相关的类进行递归复制 2 主要用Files类中的copy 方法递归复制 3 主要用Files类中的copy 方法和walkFileTree 方
  • 构建Buildroot根文件系统(I.MX6ULL)

    Busybox构建的根文件系统只有一些常用的命令和文件 Buildroot不仅集成了 busybox 而且还集成了各种常见的第三方库和软件 开发环境 Buildroot 版本 buildroot 2019 02 6 tar gz 虚拟机 4
  • XSS-通关小游戏(1-20)

    在玩游戏之前先简单的了解下 什么是XSS 1 什么是xss XSS攻击全称跨站脚本攻击 是为不和层叠样式表 Cascading Style Sheets CSS 的缩写混淆 故将跨站脚本攻击缩写为XSS XSS是一种在web应用中的计算机安
  • Unity --- UGUI(Unity Graphical user interface)--- Canvas画布

    1 UI User Interface 使用者与机器之间的交互界面 1 所谓的自适应系统指的是分辨率的适应 比如在一个分辨率下做的UI放到另一个分辨率下显示时 如果没有自适应系统的话就会导致UI过大 过小 被辟成一半等等情况 而有了自适应系
  • Android:项目结构

    前言 默认情况下 在 Android Studio 中创建 Android 项目后 将默认生成 Project Packages Scratches Android Project Fines Problems Production Tes
  • 性能指标有哪些

    1 响应时间 Response time 响应时间就是用户感受软件系统为其服务所耗费的时间 对于网站系统来说 响应时间就是从点击了一个页面计时开始 到这个页面完全在浏览器里展现计时结束的这一段时间间隔 看起来很简单 但其实在这段响应时间内
  • 开源GIS浅谈

    开源GIS浅谈 转 http blog csdn net happyduoduo1 article details 51773850 谈到GIS软件 首先让我们想到的是GIS界的龙头大哥ESRI公司旗下的ArcGIS产品 从最初接触的ver
  • js中的微任务和宏任务,附面试题

    因为javascript是一门单线程语言 所以代码的解析执行都要以自上而下的执行 直到任务队列 task queue 的出现 js开始有了异步任务 当一段代码需要稍后执行时 便可以使用异步方案 setTimeout setInterval