Event Loop 宏任务和微任务

简介: Event Loop 宏任务和微任务

0. 前言

  1. 宏任务和微任务可能部分道友并不是那么理解
  2. 之前看到一个解释 ,觉得还是不错的,就记下来了,加上自己的理解写出来记录下,但是忘了原文出处,如有侵权,请告知
  3. 需要了解JS运行机制例如事件循序等知识 EventLoop

1. EventLoop

  1. js是单线程的,同一时间只能做一件事情
  2. 宏任务(macrotask)和微任务(microtask)的区分主要是为了解决 JavaScript 引擎中不同任务之间的执行优先级问题。

1.1 同步任务异步任务

  1. 为了防止某个耗时任务导致程序假死的问题,js 把待执行的任务分为了 2 类:
  2. 同步任务 synchronous
  • 又叫做非耗时任务,指的是在主线程上排队执行的那些任务
  • 只有前一个任务执行完毕,才能执行后一个任务
  1. 异步任务
  • 又叫做耗时任务,异步任务由 JS 委托给宿主环境进行执行
  • 当异步任务执行完成后,会通知 JS 主线程 执行异步任务的回调函数

2. 执行顺序

  1. 宏任务和微任务的执行顺序是先宏后微
  2. 执行同步代码,遇到异步宏任务则将异步宏任务放入宏任务队列中,遇到异步微任务则将异步微任务放入微任务队列中,
  3. 当所有同步代码执行完毕后,再将异步微任务从队列中调入主线程执行,微任务执行完毕后再将异步宏任务从队列中调入主线程执行,一直循环直至所有任务执行完毕。

3. 具体宏任务划分 (macro)task

  1. 宏任务有:script标签的加载和执行 (可以理解为外层同步代码);
  2. setTimeout/setInterval定时器
  3. UI rendering/UI事件 --DOM 事件处理程序;
  4. postMessage,MessageChannel5.
  5. setImmediate,
  6. I/O(Node.js)
  7. AJAX 请求的回调函数
  • 对于宏任务,JavaScript 引擎会将其添加到任务队列(task queue)中,在当前任务执行完毕后按顺序依次执行

4. 具体微任务划分 Microtasks

  1. 微任务有:Promise.process.nextTick(Node.js);
    Promise的 then 方法和 catch 方法
  2. async/await 中的 await 表达式
  3. Object.observe(已废弃;Proxy 对象替代);
  4. MutaionObserver监听器
  • 对于微任务,JavaScript 引擎也会将其添加到任务队列中,但是微任务的执行在当前宏任务执行结束立即进行
  • 也就是说微任务具有更高的执行优先级,可以优先于下一个宏任务执行

5. 技巧

  • 通过区分宏任务和微任务,我们可以更好地控制任务的执行顺序,提高应用程序的性能和响应速度
  1. 在处理一些异步操作时,可以使用 Promise 来代替普通的回调函数,并通过 then 方法和 catch 方法来实现更灵活、更高效的任务处理方式。
  2. 同时,在编写代码时需要注意,尽量避免在宏任务中进行耗时操作,以免影响其他任务的执行。

6. 练习

  1. 测试下

setTimeout(() => {
    console.log("1");
});
new Promise((resolve)=>{
    console.log("2");
    resolve()
}).then(()=>{
    console.log("3");
})
console.log("4");
  1. 结果 2 4 3 1
  • 分析
  1. 先执行所有的同步任务
    创建Promise和 输出 4 都是 同步任务 先执行,

所以 2 4

  1. 在执行微任务
    then是微任务 3
  2. 在执行下一个宏任务

定时器 1

  1. 2 4  3 1

参考资料

MDN-微任务

Event Loop


初心

我所有的文章都只是基于入门,初步的了解;是自己的知识体系梳理,如有错误,道友们一起沟通交流;
如果能帮助到有缘人,非常的荣幸,一切为了部落的崛起;
共勉
相关文章
|
NoSQL Java API
分布式系统---幂等性设计
分布式系统---幂等性设计
316 1
|
小程序 前端开发 JavaScript
微信小程序(二十二)子组件调用父组件方法,父组件调用子组件方法
制作了一个自定义组件,底部弹出菜单。 显示这个菜单的时候,首先,父组件需要调用子组件的方法,显示子组件。 点击子组件的菜单,需要调用父组件的方法进行逻辑处理。
670 0
|
12月前
|
机器学习/深度学习 人工智能 自然语言处理
大模型引领6G革命!最新综述探索未来通信方式:九大方向,覆盖多模态、RAG等
随着科技发展,大模型在6G网络中展现出革命性潜力。近日,arXiv发布综述论文《大模型在电信领域的全面调查》,探讨了大模型在通信领域的应用,涵盖生成、分类、优化、预测等方向,同时指出了数据隐私、计算资源及模型可解释性等挑战。论文链接:https://arxiv.org/abs/2405.10825
403 5
|
缓存 网络协议 Serverless
函数计算操作报错合集之遇到AxiosError: Network Error错误,该如何排查
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
707 1
|
监控 前端开发 搜索推荐
react 表单受控的现代实现方案
`react-form-simple`是一个轻量级的React表单库,专注于简化受控表单的开发,提供数据绑定、验证、错误处理和UI更新等功能。它通过简洁的API减少复杂性,支持第三方UI库集成,并具备高度可扩展性。核心特点包括基于Proxy的数据绑定、实时错误处理、高效的UI更新和灵活的使用方式。通过`useForm`和`render`等钩子,开发者可以快速构建表单应用,同时支持动态表单和自定义验证规则。该库旨在提高开发效率,适用于复杂表单场景,降低学习和维护成本。
440 2
react 表单受控的现代实现方案
|
SQL 关系型数据库 PostgreSQL
SqlAlchemy 2.0 中文文档(四十八)(1)
SqlAlchemy 2.0 中文文档(四十八)
155 0
|
JavaScript 前端开发
前端 JS 经典:宏任务、微任务、事件循环(EventLoop)
前端 JS 经典:宏任务、微任务、事件循环(EventLoop)
211 0
|
前端开发 JavaScript 搜索推荐
《VitePress 简易速速上手小册》第4章 博客功能增强(2024 最新版)
《VitePress 简易速速上手小册》第4章 博客功能增强(2024 最新版)
415 0