2026/4/17 21:20:38
网站建设
项目流程
企业网站成功案例,建筑企业信息查询平台,北京市建设信息网站,龙岗网站建设_公司推广结论先给一句话#xff1a;async / await 并不是把异步变成同步#xff0c;而是用“同步写法”来写“异步代码”#xff0c;本质仍然是异步。下面我从执行方式、事件循环、性能、使用意义、对比示例一步一步讲清楚。一、最核心的区别一句话版方式本质同步代码阻塞线程#…结论先给一句话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 / Python3. 更容易做流程控制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 的语法糖它不会阻塞主线程只是让异步代码拥有同步的书写和阅读体验真正的执行仍然依赖事件循环。