news 2026/9/10 3:26:24

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/9/5 19:48:22

风靡TikTok,影响超800万辆汽车,原因竟是一根USB 线?

风靡TikTok,影响超800万辆汽车,原因竟是一根 USB 线? Bleeping Computer 网站披露,韩国汽车制造商现代(Hyundai)和起亚(Kia)给旗下约 830 万辆汽车进行了防盗安全更新(预…

作者头像 李华
网站建设 2026/9/4 11:20:17

API自动化:淘宝评价管理工具的技术实现

淘宝评价管理是商家维护口碑的重要环节,通过API自动化可以实现高效的评价监控、回复及数据分析。以下是技术实现的关键点:淘宝开放平台API接入申请淘宝开放平台的开发者账号,创建应用获取App Key和App Secret。评价相关API包括:ta…

作者头像 李华
网站建设 2026/9/1 13:41:39

2026自考必备9个降AI率工具测评榜单

2026自考必备9个降AI率工具测评榜单 2026年自考降AI率工具测评:为何需要专业榜单? 随着AIGC检测技术的不断升级,越来越多的学生和科研工作者在论文撰写过程中遭遇了“AI率超标”的难题。尤其是自考群体,面对严格的查重标准&#x…

作者头像 李华
网站建设 2026/9/7 17:13:04

NIVIDIA高性能计算CUDA笔记(三) cuFFT的简介及实现案例

NIVIDIA高性能计算CUDA笔记(三) cuFFT的简介及实现案例 1. cuFFT库的简介(Introduction of cuFFT libaray) ​ Fourier变换是数字信号处理领域一个很重要的数学变换,它用来实现将信号实现将信号从时域到频域的变换…

作者头像 李华