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

6.promise在哪个线程执行?(2)

😺😺Promise 本身的执行、回调注册、状态改变 都在主线程进行。
真正的“异步”工作(比如请求、定时器、文件读写)由浏览器或 Node 的后台线程/模块处理完成,完成后通过事件队列再通知主线程执行后续逻辑**。

JS 只有一个主线程,但它背后站着一群“打下手”的模块帮它做事(比如 I/O、定时器)!

😺😺 用图理解(文字版图示)

JS主线程(运行 JS 代码)

├─ 执行 Promise 代码(同步部分)

├─ 发出异步请求(如 Ajax、setTimeout)

└─ 把“回调函数”交给浏览器或 Node 的“异步模块”处理

[浏览器/Node 异步模块,如 libuv、Web APIs]
↓(一段时间后)
结果准备好了!

把回调放入“事件队列”(任务队列)

[主线程空了? → 从队列中取出 → 执行 then() 的回调]

😺😺例子解释

console.log(‘1’);

setTimeout(() => {
console.log(‘2’);
}, 0);

Promise.resolve().then(() => {
console.log(‘3’);
});

console.log(‘4’);

输出是:

1
4
3
2

解释:

阶段 发生了什么
主线程执行 打印 1
注册 setTimeout 回调 交给浏览器 Web API 模块处理
注册 Promise.then 回调 加入 微任务队列
打印 4
主线程空了,先执行微任务队列 打印 3
然后执行宏任务队列中的 setTimeout 回调 打印 2

😺😺总结
在这里插入图片描述

😺😺什么是微任务队列?

微任务队列(Microtask Queue):是一个专门用于存放**“Promise 的回调函数”**等细粒度任务的小任务队列。
它的执行优先级比普通的回调(如 setTimeout)更高。

JavaScript 任务队列分类(一定要知道)

在这里插入图片描述

😺 举个例子说明执行顺序

console.log(‘1’);

setTimeout(() => {
console.log(‘2’);
}, 0);

Promise.resolve().then(() => {
console.log(‘3’);
});

console.log(‘4’);

输出顺序是:

1
4
3 ← 微任务
2 ← 宏任务

因为:
• Promise.then() 里的任务进了微任务队列
• setTimeout 的回调进了宏任务队列
• 当前事件循环中,先清空微任务队列,再执行下一个宏任务

😺😺那这个“微任务队列”的能力是谁赋予的?
答案是:JavaScript 引擎(如 V8)+ 执行环境(如浏览器、Node.js)共同实现了事件循环机制,包括微任务队列的调度。

分工如下:

在这里插入图片描述

😺所以总结来说:

微任务队列是JavaScript 运行时环境中的一个调度机制,用于安排那些紧接着当前执行完成后就要执行的任务。

“同步完了立刻清微任务,微任务清完才轮宏任务。”

😺demo:如何手动创建微任务?

queueMicrotask(() => {
console.log(‘我是一个微任务’);
});

它跟 .then() 效果一样,只不过不依赖 Promise。

需要我给你配一个浏览器事件循环调度过程的动画图吗?或者写个 async/await + 微任务 + 宏任务顺序的例子?你一看就懂。

举个例子说明执行顺序

console.log(‘1’);

setTimeout(() => {
console.log(‘2’);
}, 0);

Promise.resolve().then(() => {
console.log(‘3’);
});

console.log(‘4’);

输出顺序是:

1
4
3 ← 微任务
2 ← 宏任务

因为:
• Promise.then() 里的任务进了微任务队列
• setTimeout 的回调进了宏任务队列
• 当前事件循环中,先清空微任务队列,再执行下一个宏任务

http://www.xdnf.cn/news/11982.html

相关文章:

  • Three.js进阶之音频处理与展示
  • C++.vector 容器(1.5w字)
  • 虚幻网络执行宏-核心作用是根据网络环境中的不同执行环境
  • 抗辐射·耐温差·抑振动:解析猎板PCB真空塞孔在航天电子中的核心价值​
  • 图像局部精度超限情况
  • GDB的调试
  • HTB 靶机 SolarLab Write-up(Medium)
  • Nginx 安全设置问题
  • 计算机I/O系统:数据交互的核心桥梁
  • 论文导读 | 子图匹配最新进展
  • Office安装
  • C#编程过程中变量用中文有啥影响?
  • 【Python零基础入门系列】第7篇:Python中的错误与异常处理
  • 每日八股文6.4
  • C++ 变量二
  • geoai库的训练数据查看与处理
  • 核心机制:拥塞控制
  • 使用pgAdmin导入sql文件
  • 《波段操盘实战技法》速读笔记
  • 数据库-数据查询-in和Not in
  • Linux容器篇、第一章_01Linux系统下 Docker 安装与镜像部署全攻略
  • StringRedisTemplete使用
  • 智能合约安全漏洞解析:从 Reentrancy 到 Integer Overflow
  • 算法训练第八天
  • 电气架构/域控制器/中央计算平台技术论坛
  • 考研系列—操作系统:冲刺笔记(4-5章)
  • 自动化测试工具playwright中文文档-------18.模拟
  • 宝塔使用docker创建n8n
  • 每日一令:Linux 极简通关指南 - 汇总
  • 树莓派超全系列教程文档--(54)如何使用rsync在计算机之间同步文件夹