async/await 依赖 promise 状态流转传递错误,promise 静态方法决定组合任务的整体状态;await 等待 promise 终态,fulfilled 则解值继续执行,rejected 且未捕获则抛错中断;promise.all 任一失败即 reject,promise.allsettled 永远 fulfilled,需手动检查结果状态。

async/await 本身不直接“传播错误”,而是依赖 Promise 的状态流转机制来传递失败信号;Promise 静态方法(如 Promise.all、Promise.race、Promise.any 等)则决定了多个异步任务组合后的整体状态,进而影响 await 后的错误行为。二者协作的关键,在于理解“await 等待的是什么”以及“该 Promise 最终是 fulfilled 还是 rejected”。
await 实际等待的是 Promise 的终态
await 并不关心 Promise 内部怎么执行,只等待它进入 fulfilled 或 rejected 状态:
- 如果被 await 的 Promise 成功完成(fulfilled),await 表达式解出其值,继续向下执行
- 如果被 await 的 Promise 被拒绝(rejected),且没有被 try/catch 捕获,错误会向上抛出,中断当前 async 函数后续逻辑
- 注意:
Promise.all([p1, p2])在任一子 Promise 失败时立即 reject;而Promise.allSettled([p1, p2])总是 fulfilled,只是结果数组里包含每个子 Promise 的 status 和 value/reason
常见静态方法对 await 错误行为的影响
不同静态方法返回的 Promise 具有不同的失败策略,直接影响 await 是否触发 catch:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- Promise.all:只要一个失败,整个 Promise 就 reject → await 会直接抛错
- Promise.race:谁先 settle(无论成功或失败),就以它的结果为准 → 若最快的是 reject,await 抛错;若最快的是 resolve,await 继续
- Promise.any:只要有一个 fulfilled,就 resolve;全部 rejected 才 reject → await 通常不会因单个失败中断,除非全部失败
- Promise.allSettled:永远 resolve → await 永远不会因子任务失败而抛错,需手动检查每个结果的 status 字段
错误处理推荐写法
在组合多个异步任务时,应根据业务语义选择静态方法,并配合 try/catch 明确错误边界:
- 需要“全成功才继续” → 用
Promise.all+ try/catch 包裹 await - 需要“只要一个成功就行” → 用
Promise.any,失败时捕获 AggregateError - 需要“不管成败都要汇总结果” → 用
Promise.allSettled,之后遍历 results 判断每个 outcome - 避免在未包裹 try/catch 的情况下 await 一个可能 reject 的
Promise.all,否则错误会冒泡到调用栈上层
一个典型协作示例
比如并发请求用户信息和配置,要求两者都成功才渲染页面:
async function loadPage() {
try {
const [user, config] = await Promise.all([
fetch('/api/user').then(r => r.json()),
fetch('/api/config').then(r => r.json())
]);
render({ user, config });
} catch (err) {
showError('加载失败,请重试');
}
}
这里 Promise.all 将两个 fetch 封装为一个整体 Promise,await 等待它;一旦任一请求失败,catch 就能捕获并统一处理 —— 这就是 async/await 与 Promise 静态方法协同工作的自然方式。










