async函数中多个await默认按顺序执行,首个reject即中断后续;可用独立try/catch、promise.allsettled或safeawait实现容错并行处理。

async 函数中多个 await 如果都可能拒绝(即 Promise 被 reject),默认行为是:**只要有一个 await 抛出错误,后续 await 就不会执行,函数立即退出并返回一个 rejected Promise**。这不是“多个拒绝同时发生”,而是按顺序执行、遇到第一个拒绝就中断。
用 try/catch 捕获单个 await 的错误
最常用方式是为每个 await 单独包裹 try/catch,避免错误中断后续逻辑:
✅ 推荐写法(独立处理每个异步操作):
async function handleMultipleRequests() {
let data1 = null;
let error1 = null;
try {
data1 = await fetch('/api/user').then(r => r.json());
} catch (err) {
error1 = err;
}
let data2 = null;
let error2 = null;
try {
data2 = await fetch('/api/posts').then(r => r.json());
} catch (err) {
error2 = err;
}
// 两个请求都已完成(无论成功或失败),可统一处理结果
console.log({ data1, error1, data2, error2 });
}
用 Promise.allSettled 并行处理多个 await
如果希望所有异步操作**同时发起、全部等待完成(不因某个失败而中断)**,应避免链式 await,改用 Promise.allSettled():
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
✅ 更简洁的并行容错方案:
async function handleAllRequests() {
const results = await Promise.allSettled([
fetch('/api/user').then(r => r.json()),
fetch('/api/posts').then(r => r.json()),
fetch('/api/config').then(r => r.json())
]);
const [userResult, postsResult, configResult] = results;
if (userResult.status === 'fulfilled') {
console.log('User:', userResult.value);
} else {
console.warn('User failed:', userResult.reason);
}
if (postsResult.status === 'fulfilled') {
console.log('Posts:', postsResult.value);
} else {
console.warn('Posts failed:', postsResult.reason);
}
}
不要用 Promise.all 处理可能失败的多个 await
Promise.all() 在任意一个 Promise reject 时就立刻 reject,无法获取其他已完成的结果,不适合“容忍部分失败”的场景:
// ❌ 错误示例:一个失败,全部丢失结果
const [a, b, c] = await Promise.all([
Promise.reject('fail1'),
Promise.resolve('ok2'),
Promise.resolve('ok3')
]); // 直接抛错,b 和 c 的值拿不到
封装工具函数简化错误处理
可以写一个通用的 safeAwait 辅助函数,让每个 await 返回 [data, error] 元组:
async function safeAwait(promise) {
try {
const data = await promise;
return [data, null];
} catch (error) {
return [null, error];
}
}
// 使用示例
async function example() {
const [user, userErr] = await safeAwait(fetch('/api/user').then(r => r.json()));
const [posts, postsErr] = await safeAwait(fetch('/api/posts').then(r => r.json()));
if (userErr) console.error('User load failed:', userErr);
if (postsErr) console.error('Posts load failed:', postsErr);
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










