首页 > 编程语言 >JavaScript 中的宏任务与微任务

JavaScript 中的宏任务与微任务

时间:2024-08-13 16:39:51浏览次数:14  
标签:setTimeout 代码 JavaScript 任务 Promise 执行

JavaScript 是一种单线程的编程语言,这意味着在同一时间只能执行一个任务。为了有效地处理并发操作,JavaScript 引入了事件循环(Event Loop)机制,其中宏任务(Macro Task)和微任务(Micro Task)在其中扮演着关键角色。

1. 什么是宏任务和微任务?

  • 宏任务(Macro Task) 是 JavaScript 中执行的大块任务或代码块,它包括了一些常见的操作,如:

    • setTimeout
    • setInterval
    • setImmediate(仅在 Node.js 中)
    • I/O 操作
    • UI 渲染
    • 事件处理
  • 微任务(Micro Task) 是一个需要在当前宏任务完成后、下一个宏任务开始前立即执行的小任务。常见的微任务有:

    • Promise.thenPromise.catchPromise.finally
    • MutationObserver
    • process.nextTick(仅在 Node.js 中)

2. 事件循环与任务队列

JavaScript 的事件循环决定了宏任务和微任务的执行顺序。事件循环的基本流程如下:

  1. 执行全局代码:当 JavaScript 代码第一次运行时,首先会执行同步代码,这些代码被当作一个宏任务。
  2. 检查微任务队列:一旦宏任务完成,事件循环会检查并执行微任务队列中的所有任务,直到队列为空。
  3. 执行下一个宏任务:如果微任务队列为空,事件循环会从宏任务队列中取出下一个任务并执行。
  4. 重复上述步骤:这个过程会不断循环,直到所有任务执行完毕。

3. 宏任务与微任务的执行顺序

了解宏任务与微任务的执行顺序对于掌握 JavaScript 异步操作非常重要。以下是一些关键点:

  • 微任务总是在当前宏任务结束后立即执行,优先级高于下一个宏任务。
  • 如果在微任务中再次添加微任务,这些新添加的微任务会在当前微任务队列完成后立即执行。

示例代码:

console.log('Start');

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

Promise.resolve().then(() => {
    console.log('Promise 1');
}).then(() => {
    console.log('Promise 2');
});

console.log('End');

 

 

执行顺序解释:

  1. 'Start''End' 是同步代码,首先执行。
  2. setTimeout 是一个宏任务,它会在宏任务队列中排队,等待当前宏任务完成后执行。
  3. Promise.then 是一个微任务,它会在当前宏任务(即同步代码执行完毕后)立即执行。
  4. 因此,微任务 'Promise 1''Promise 2' 会先于 setTimeout 的回调执行。
  5. 最后,setTimeout 的回调会被执行。

输出顺序:

Start
End
Promise 1
Promise 2
setTimeout

 

 

4. 宏任务与微任务的应用场景

理解宏任务和微任务的执行机制可以帮助我们在开发中更好地控制异步操作,避免意外的执行顺序。

场景一:控制异步代码的执行顺序

假设我们希望某些异步代码在其他异步代码之后执行,利用微任务的高优先级特性,可以确保其顺序执行。例如,我们可以使用 Promise.then 来控制执行顺序,而不是使用 setTimeout

场景二:优化性能

在高频率的用户交互或动画渲染场景中,我们可以利用微任务来进行一些轻量的操作,如 DOM 更新或状态检查,而将耗时较长的操作放在宏任务中处理。这可以减少 UI 的卡顿,提升用户体验。

场景三:避免深度嵌套的回调

在一些复杂的异步操作中,如果直接使用宏任务(如 setTimeout),可能会导致嵌套层级过深,难以维护。利用 Promise 创建微任务可以使代码更简洁、可读性更好,同时也更易于调试。

 

标签:setTimeout,代码,JavaScript,任务,Promise,执行
From: https://www.cnblogs.com/zx618/p/18357231

相关文章

  • 分布式任务调度的架构与选型
    场景任务调度是指系统在约定的特定时刻自动去执行指定任务的过程。比如:某新闻App每天上午10点给用户推送最新新闻。某电商系统需要在每天上午10点,下午3点,晚上8点等不同适合发放一批优惠券。某银行系统需要在信用卡到期还款日的前三天每天进行短信提醒。某财务系统需要......
  • JavaScript函数
    定义函数形如functionabs(x){if(x>=0){returnx;}else{return-x;}}或varabs=function(x){if(x>=0){returnx;}else{return-x;}};如上所表达的函数为一个匿名函数,它没有函数名,该......
  • 掌握 schtasks 的高级功能,并有效管理和调度复杂任务。深入的 schtasks 使用指导,帮助用
    schtasks是一个Windows命令行工具,用于创建、删除、配置或显示计划任务。你可以用它来安排任务的自动执行,比如运行脚本或程序。schtasks的功能可以分为以下几类:创建任务:设定新任务的执行时间、频率和程序。删除任务:移除已存在的任务。修改任务:更新任务的执行时间、条件或......
  • JavaScript高阶笔记总结(Xmind格式):第三天
    Xmind鸟瞰图:简单文字总结:js高阶笔记总结:严格模式:  1.开启严格模式:"usestrict"  2.不使用var关键字声明会报错  3.严格模式下普通函数的this指向undefined高阶函数:  满足其中之一即高阶函数:    1.函数作为参数    2.函数作为返回值......
  • JavaScript魔法:在线Excel附件上传与下载的完美解决方案
    最新技术资源(建议收藏)https://www.grapecity.com.cn/resources/前言在本地使用Excel时,经常会有需要在Excel中添加一些附件文件的需求,例如在Excel中附带一些Word,CAD图等等。同样的,类比到Web端,现在很多人用的在线Excel是否也可以像本地一样实现附件文件的操作呢?答案是肯定的,不......
  • freertos怎么查看任务内存是否溢出
    1.允许堆栈检测API的使用打开FreeRTOSConfig.h文件,找到宏INCLUDE_uxTaskGetStackHighWaterMark并将其值定为1。2.uxTaskGetStackHighWaterMark函数的说明点击查看代码/**函数参数:xTask:需要检查的堆栈情况的任务句柄。将xTask设置为NULL的话检测的就是调用这个函......
  • ntdsutil.exe 是一个用于管理和维护 Windows Server 中的 Active Directory 数据库的
     ntdsutil.exe是一个用于管理和维护WindowsServer中的ActiveDirectory数据库的命令行工具。它允许管理员执行多种任务,包括: 备份和还原ActiveDirectory数据库:你可以使用ntdsutil来创建数据库的备份、还原数据库以及检查和修复数据库的完整性。维护和修复Act......
  • 提升前端性能的JavaScript技巧
    1.前端JavaScript性能问题前端JavaScript的性能问题可以显著影响Web应用的用户体验和整体性能。以下是一些常见的前端JavaScript性能问题:1.1.频繁的DOM操作问题描述:JavaScript经常需要与DOM(文档对象模型)交互来更新页面内容。然而,每次DOM操作都可能触发浏览器的重绘(rep......
  • Linux进程和计划任务管理
    目录一、进程基本概念1.进程2.程序和进程的关系 二、查看进程信息1.ps命令1.1 psaux命令1.2ps-elf命令 2.top命令 3.pgrep命令 4.jobs命令 三、查看进程树 四、进程的启动方式1.手动启动2.调度启动五、终止进程的运行1.Ctrl+C组合键2.kill......
  • JavaScript数据类型
    JavaScript共有8种数据类型,可以分为两类:基本数据类型和复杂数据类型。1.基本数据类型(PrimitiveTypes)这些数据类型是不可变的,意味着一旦创建了它们的值,就无法更改。Number:用于表示整数和浮点数。例如:42,3.14,-7BigInt:用于表示任意精度的大整数。例如:1234567890123456......