JavaScript async/await是什么_它如何简化异步代码

发布时间 - 2026-01-06 00:00:00    点击率:
async/await是基于Promise的语法糖,await只能在async函数中使用,会等待Promise settle(含reject并抛错),需try/catch捕获;多个await默认串行,应优先用Promise.all并发。

async/await 是语法糖,不是新机制

它底层完全基于 Promise,没有引入任何新异步模型。写 async function foo() { return 42; } 等价于 function foo() { return Promise.resolve(42); }await bar() 就是 bar().then(...) 的更直观写法。

await 只能在 async 函数里用

直接在顶层或普通函数中写 await fetch('/api') 会报 SyntaxError: await is only valid in async function。常见误用场景包括:

  • 在事件回调(如 button.addEventListener('click', () => { await fn(); }))里忘了给箭头函数加 async
  • Node.js 脚本顶层想直接 await,得改用 async () => { ... }() 或启用 --experimental-top-level-await(仅限 Node.js 14.8+)
  • Vue 选项式 API 的 methods 里写了 await,但没把方法声明为 async method() { ... }

await 会等待 Promise settle,不只是 resolve

await 不仅等 fulfilled,也等 rejected —— 遇到 reject 会直接抛出错误,就像同步代码里 throw 一样。这意味着:

  • 不加 try/catch,错误会冒泡中断后续执行
  • await Promise.reject(new Error('oops')) 等价于 throw new Error('oops')
  • 想捕获错误,必须用 try { await apiCall(); } catch (e) { ... },不能靠 .catch()
async function loadUser() {
  try {
    const res = await fetch('/user');
    if (!res.ok) throw new Error(`HTTP ${res.status}`);
    return await res.json();
  } catch (err) {
    console.error('Failed to load user:', err.message);
    return null;
  }
}

多个 await 默认串行,想并发得用 Promise.all

const a = await fn1(); const b = await fn2(); 是严格串行的:fn2 要等 fn1 完全结束才开始。实际中多数请求可以并发,否则白白浪费时间。

  • 并发写法:const [a, b] = await Promise.all([fn1(), fn2()]);
  • 注意 Promise.all 一有 reject 就整体失败;需要容错用 Promise.allSettled
  • 不要滥用 await 在循环里:for (const id of ids) { await fetch(`/item/${id}`); } 是最慢的写法
真正容易被忽略的是错误传播路径和并发控制粒度——await 让代码看起来像同步,但网络延迟、reject 行为、资源竞争一点没少,只是藏得更深了。


# vue  # javascript  # java  # js  # node.js  # json  # node  # ai 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  jQuery validate插件功能与用法详解  香港服务器WordPress建站指南:SEO优化与高效部署策略  焦点电影公司作品,电影焦点结局是什么?  网站建设整体流程解析,建站其实很容易!  长沙企业网站制作哪家好,长沙水业集团官方网站?  html5的keygen标签为什么废弃_替代方案说明【解答】  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  利用JavaScript实现拖拽改变元素大小  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  Laravel安装步骤详细教程_Laravel环境搭建指南  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  如何选择PHP开源工具快速搭建网站?  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  香港服务器如何优化才能显著提升网站加载速度?  如何获取上海专业网站定制建站电话?  Java遍历集合的三种方式  如何选择可靠的免备案建站服务器?  Laravel如何使用Sanctum进行API认证?(SPA实战)  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  如何用虚拟主机快速搭建网站?详细步骤解析  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  大型企业网站制作流程,做网站需要注册公司吗?  Laravel如何自定义分页视图?(Pagination示例)  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  如何在建站主机中优化服务器配置?  高性价比服务器租赁——企业级配置与24小时运维服务  iOS正则表达式验证手机号、邮箱、身份证号等  b2c电商网站制作流程,b2c水平综合的电商平台?  如何用AWS免费套餐快速搭建高效网站?  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  电商网站制作价格怎么算,网上拍卖流程以及规则?  大连 网站制作,大连天途有线官网?  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  JavaScript如何实现错误处理_try...catch如何捕获异常?  如何在自有机房高效搭建专业网站?  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  js实现获取鼠标当前的位置  WordPress 子目录安装中正确处理脚本路径的完整指南  Java类加载基本过程详细介绍  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  奇安信“盘古石”团队突破 iOS 26.1 提权  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  PHP 500报错的快速解决方法