news 2026/4/23 17:45:52

JavaScript 中 async + await 和直接同步方式执行有什么区别和意义

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JavaScript 中 async + await 和直接同步方式执行有什么区别和意义

结论先给一句话:

async / await并不是把异步变成同步,而是用“同步写法”来写“异步代码”,本质仍然是异步。

下面我从执行方式、事件循环、性能、使用意义、对比示例一步一步讲清楚。


一、最核心的区别一句话版

方式本质
同步代码阻塞线程,一步不完成,后面不执行
async + await不阻塞线程,遇到await会“暂停当前函数”,把控制权交回事件循环

JavaScript只有一条主线程,真正的“同步等待”在 JS 里几乎是不存在的(除非你卡死浏览器)。


二、执行层面到底发生了什么?

1. 同步方式(阻塞)

function syncTask() { const result = heavyCompute(); // 假设是耗时操作 console.log(result); console.log('end'); }

执行流程:

heavyCompute 完成 → console.log(result) → console.log('end')

问题:

  • 浏览器/UI 会卡死

  • JS 主线程被占用

  • 用户无法点击、滚动


2. async / await(非阻塞)

async function asyncTask() { const result = await fetch('/api/data'); console.log(result); console.log('end'); }

真实执行流程是:

调用 asyncTask ↓ 遇到 await ↓ 当前 asyncTask 暂停 ↓ JS 主线程继续执行其他任务 ↓ Promise resolved ↓ asyncTask 恢复执行

JS 并没有“等在那里”


三、用事件循环角度看区别(重点)

示例对比

console.log('start'); async function test() { console.log('a'); await Promise.resolve(); console.log('b'); } test(); console.log('end');

实际输出顺序是:

start a end b

为什么?

  • await后面的代码会被放进微任务队列

  • 当前同步栈执行完后才继续

await = Promise.then 的语法糖


四、async / await 和 Promise.then 本质是一样的

async / await 写法

async function getData() { const res = await fetch(url); const data = await res.json(); return data; }

等价 Promise 写法

function getData() { return fetch(url) .then(res => res.json()) .then(data => data); }

区别不在执行方式,在“可读性”


五、那 async / await 的“意义”到底是什么?

1. 让异步代码像同步一样“好读”

对比感受一下:

Promise 地狱版本
getUser() .then(user => { return getOrders(user.id); }) .then(orders => { return getOrderDetail(orders[0].id); }) .then(detail => { console.log(detail); }) .catch(err => console.error(err));
async / await 版本
async function run() { try { const user = await getUser(); const orders = await getOrders(user.id); const detail = await getOrderDetail(orders[0].id); console.log(detail); } catch (e) { console.error(e); } }

逻辑是线性的,但执行仍是异步的


2. 错误处理更像同步代码

try { const res = await fetch(url); } catch (err) { console.error(err); }

.catch()

  • 更直观

  • 不容易漏掉异常

  • 更接近传统语言(Java / Python)


3. 更容易做流程控制

if (needLogin) { await login(); } await loadData(); await renderPage();

不用嵌套、不用链式调用。


六、async / await 并不能解决什么问题?

1. 不能提升性能

await task1(); await task2();

等价于串行

如果想并行:

await Promise.all([task1(), task2()]);

2. 不能变成真正同步

JS 里不存在

const data = fetchSync(url); //

如果有,浏览器会直接卡死。


七、什么时候“看起来像同步”但不是同步?

误区示例

const data = await fetch(url);

很多人以为:

“这一行执行完才会执行下一行,所以是同步”

❌ 错

✅ 正确理解是:

  • 函数暂停

  • 主线程继续

  • 不是阻塞等待


八、一句话总结(面试可用)

async / await 的本质是 Promise 的语法糖,它不会阻塞主线程,只是让异步代码拥有同步的书写和阅读体验,真正的执行仍然依赖事件循环。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 15:53:03

MATLAB代码:基于二阶锥优化的电气综合能源系统多目标无功优化(配网设备模型及网损优化方案研究

MATLAB代码:基于二阶锥优化的电气综合能源系统多目标无功优化 关键词:配电网 无功优化 二阶锥 电气综合能源系统 参考文档:《含高比例光伏的配电网有功-无功功率多目标协调优化》参考部分配电网设备模型,非完全复现,…

作者头像 李华
网站建设 2026/4/23 12:38:14

【万字硬核】从GPT-5.2到Sora2:深度解构多模态大模型的“物理直觉”与Python全栈落地指南(内含Banana2实测)

摘要: 当我们在谈论大模型时 我们在谈论什么 是参数量的暴力美学 还是Transformer架构的无限延展 2025年的AI界 已经不再满足于文本的生成 GPT-5.2-Pro开始具备了逻辑推理的“慢思考”能力 Sora2与Veo3正在试图模拟物理世界的运行规律 而Banana2则在图像生成的语义理…

作者头像 李华
网站建设 2026/4/23 11:13:18

[SSM]SpringBoot

SpringBoot简介 入门案例 回顾SpringMVC开发的步骤 创建工程,并在 pom.xml 配置文件中配置所依赖的坐标 编写 web3.0 的配置类 编写 SpringMVC 的配置类 编写 Controller 类 从上面的 SpringMVC 程序开发可以看到,前三步都是在搭建环境,而…

作者头像 李华
网站建设 2026/4/19 1:54:07

人工电销和AI机器人功能的根本区别是什么

“拨号两小时,沟通五分钟”“空号拒接占一半,有效线索难寻觅”“高频外呼就封号,业务中断心发慌”…… 这些电销困境,是不是正困扰着你的团队? 传统外呼模式下,人工效率低、封号风险高、数据管理乱三大痛点…

作者头像 李华
网站建设 2026/4/23 11:14:35

AI 模型指令

表格转置「把这个表格转置一下」 ✅「行列互换」 ✅「纵横坐标对调」 ✅「产品放到第一列&#xff0c;参数放到第一行」 ✅「跟刚才那个一样&#xff0c;做成转置表」 ✅ 「交换表格 / 表格转置」 我默认做的事情是&#xff1a;行 ↔ 列 完整互换<h2 class"dtcolor-gre…

作者头像 李华