当前位置: 首页 > news >正文

JavaScript中异步函数的执行时机

JavaScript中,异步方法执行时机是什么时候?

在JavaScript中,异步方法的执行时机取决于多种因素,主要是事件循环(Event Loop)和任务的类型(如宏任务、微任务)。
理解这些概念对于掌握异步编程至关重要。

事件循环(Event Loop)

JavaScript是单线程的,这意味着它一次只能执行一个任务。事件循环是用来处理异步操作(如定时器、网络请求、用户输入等)的机制。事件循环会不断地检查调用栈(Call Stack)是否为空,如果为空,则检查微任务队列(Microtask Queue),如果微任务队列也为空,则检查宏任务队列(Macrotask Queue),依次执行队列中的任务。

宏任务(Macrotask)

宏任务包括:

  • setTimeout()
  • setInterval()
  • I/O 操作(如文件读写)
  • UI 渲染

宏任务之间的切换由事件循环控制。每次事件循环迭代开始时,都会从宏任务队列中取出一个任务来执行。

微任务(Microtask)

微任务包括:

  • Promise 的回调(thencatchfinally
  • MutationObserver
  • queueMicrotask()

微任务会在当前宏任务执行完成后、下一个宏任务执行之前立即执行。也就是说,一个宏任务执行完之后,会先清空微任务队列中的所有任务,然后再开始执行下一个宏任务。

异步方法的执行时机示例

console.log('Start');setTimeout(() => {console.log('setTimeout');
}, 0);Promise.resolve().then(() => {console.log('Promise');
});console.log('End');

输出结果为:

Start
End
Promise
setTimeout

解释:

  1. console.log('Start') 同步执行,立即输出 “Start”。
  2. setTimeout 被放入宏任务队列。
  3. Promise.resolve().then(...) 中的回调被放入微任务队列。
  4. console.log('End') 同步执行,立即输出 “End”。
  5. 当前宏任务执行完毕,事件循环开始处理微任务队列,执行 Promise 的回调,输出 “Promise”。
  6. 微任务队列清空后,事件循环开始处理下一个宏任务,执行 setTimeout 的回调,输出 “setTimeout”。

总结

  • 异步方法(如 setTimeoutPromise)不会立即执行,而是根据它们被放入的队列类型(宏任务或微任务)在适当的时候由事件循环调度执行。

  • 宏任务之间的切换由事件循环控制,每次事件循环迭代会先执行微任务队列中的所有任务。

  • 理解事件循环和任务的类型对于编写和理解异步JavaScript代码至关重要。


http://www.mrgr.cn/news/68840.html

相关文章:

  • 区块链技术入门:以太坊智能合约详解
  • Docker Compose部署Rabbitmq(延迟插件已下载)
  • 【LeetCode:64】最小路径和(Java)
  • Excel快捷键大全
  • qt QErrorMessage详解
  • tinymce扩展功能:1、行高、段落间距、格式刷;2、视频上传进度条;3、对复制的图片设置尺寸
  • Python 中使用组合方式构建复杂正则
  • Java 中如何巧妙应用 Function 让方法复用性更强
  • 三十五、Python基础语法(文件操作-下)
  • MIT 6.S081 Lab1: Xv6 and Unix utilities翻译
  • 关于向前欧拉法的一些总结
  • ARXML汽车可扩展标记性语言规范讲解
  • 单细胞 RNA 测序分析的当前最佳实践:教程-文献精读80
  • 【AI日记】24.11.08 Knowledge Graphs for RAG (知识图谱,Neo4j,Cypher)
  • C++builder中的人工智能(12):了解ELU(Exponential Linear Unit)——人工神经网络中的激活函数
  • 【Android】名不符实的Window类
  • AutoSar AP CM中的序列化总结
  • C++builder中的人工智能(10)神经网络中的Sigmoid函数
  • 苍穹外卖day09超出配送范围前端不提示问题
  • 367.有效地完全平方数
  • HCIP MPLS基础
  • 【JavaScript】网络请求之Promise fetch Axios及异步处理
  • YOLO11 旋转目标检测 | 数据标注 | 自定义数据集 | 模型训练 | 模型推理
  • 新一代AI换脸更自然,DeepLiveCam下载介绍(可直播)
  • C++代码优化(二): 区分接口继承和实现继承
  • 小白docker入门简介