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报错的快速解决方法


await fn(); })