await 使 async 函数暂停执行以等待 Promise 结果,必须在 async 函数内使用;可 await 任意值,自动转为 Promise;需 try/catch 显式捕获错误;支持串行与 Promise.all 等并行控制。

await 关键字本身不直接“处理” Promise,而是让 async 函数暂停执行,等待 Promise 的最终状态,并提取其成功值。它让异步代码写起来像同步代码,但底层仍是基于 Promise 的微任务机制。
await 必须配合 async 使用
await 只能在被 async 修饰的函数内部使用。这是因为 async 函数会自动把返回值包装成 Promise,同时为 await 提供执行上下文。
- 直接在普通函数或全局作用域中写
await fetch(...)会报SyntaxError: await is only valid in async functions - 箭头函数也可用 async:
const loadData = async () => { const res = await fetch('/api'); return res.json(); }; - 对象方法、类方法同样支持:
class ApiClient { async get() { return await fetch(...); } }
await 等待的是“可 await 值”,不只是 Promise
await 后面可以跟任何值:Promise、原始值(字符串、数字)、undefined,甚至 null。JavaScript 会自动调用 Promise.resolve() 把非 Promise 值转为已解决的 Promise。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
await 42→ 立即得到 42(等价于await Promise.resolve(42)) -
await 'hello'→ 立即得到 'hello' -
await fetch(url)→ 真正等待网络响应完成 - 这种设计让逻辑更统一,无需每次都手动包装
错误必须显式捕获
await 不会静默吞掉 rejected Promise,而是把拒绝原因当作异常抛出。不加 try/catch 就会导致 async 函数返回 rejected Promise,并可能引发未捕获异常。
立即学习“Java免费学习笔记(深入)”;
- 正确做法:
try { const data = await fetch('/api').then(r => r.json()); } catch (err) { console.error('请求失败:', err); } - 注意:fetch 本身只在网络错误时 reject,HTTP 错误状态(如 404、500)仍算 fulfilled,需手动检查
response.ok - 也可以用
.catch()链式处理再 await:const data = await fetch('/api').catch(() => null).then(r => r?.json());
控制并发与顺序的关键组合
await 天然串行,适合有依赖关系的操作;配合 Promise.all 或 Promise.allSettled 则可并行发起多个请求。
- 串行(A 完了才发 B):
const a = await api.getUser(); const b = await api.getProfile(a.id); - 并行(同时发 A 和 B):
const [a, b] = await Promise.all([api.getUser(), api.getSettings()]); - 容错并行(不管谁失败都继续):
const results = await Promise.allSettled([fetch('/a'), fetch('/b')]);

















