Promise 是处理异步依赖的核心机制,支持链式 .then() 串行、async/await 同步化、Promise.all() 并行及条件分支等模式,兼顾清晰性与灵活性。

Promise 是 JavaScript 中处理多步异步依赖最常用、最清晰的方式之一。核心思路是:**把每一步异步操作包装成一个 Promise,再用 .then() 串起来,或用 async/await 让流程像同步代码一样可读。**
用链式 .then() 处理线性依赖
适合“上一步结果是下一步输入”的场景,比如:获取用户 ID → 查用户信息 → 查该用户的订单。
关键点:
- 每个
.then()回调里返回一个新的 Promise(或普通值),它会自动被下一个.then()接收; - 一旦某个环节出错(
reject或抛异常),后续所有.then()都跳过,直到遇到.catch(); - 避免“回调地狱”,但嵌套过深时仍可能难维护。
示例:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
fetch('/api/user-id')
.then(res => res.json())
.then(data => fetch(`/api/user/${data.id}`))
.then(res => res.json())
.then(user => fetch(`/api/orders?userId=${user.id}`))
.then(res => res.json())
.then(orders => console.log('全部完成:', { user, orders }))
.catch(err => console.error('某一步失败:', err));
用 async/await 让流程更直观
这是目前推荐的写法,语义清晰、调试方便、错误处理统一。
注意:
-
await只能在async函数内使用; - 每个
await会暂停执行,等 Promise settle 后继续,后面的代码就像写同步逻辑一样; - 用
try/catch捕获任意一步的错误,比链式.catch()更自然。
示例:
立即学习“Java免费学习笔记(深入)”;
async function loadUserProfile() {
try {
const idRes = await fetch('/api/user-id');
const { id } = await idRes.json();
const userRes = await fetch(`/api/user/${id}`);
const user = await userRes.json();
const orderRes = await fetch(`/api/orders?userId=${user.id}`);
const orders = await orderRes.json();
return { user, orders };
} catch (err) {
console.error('加载失败:', err);
throw err;
}
}
并行 + 串行混合:用 Promise.all() 提升效率
当某些步骤彼此独立(比如同时查用户头像、权限、通知数),但后续步骤又依赖它们全部完成,就用 Promise.all() 并发发起请求。
要点:
-
Promise.all([p1, p2, p3])返回一个新 Promise,所有子 Promise 都成功才 resolve,任一 reject 就立即 reject; - 结果是数组,顺序与传入顺序一致,和响应快慢无关;
- 适合“先并发拉数据,再统一处理”的模式。
示例:
立即学习“Java免费学习笔记(深入)”;
async function loadDashboard() {
try {
const [userRes, notificationsRes, settingsRes] = await Promise.all([
fetch('/api/user'),
fetch('/api/notifications/unread'),
fetch('/api/settings')
]);
const [user, notifications, settings] = await Promise.all([
userRes.json(),
notificationsRes.json(),
settingsRes.json()
]);
// 所有数据到齐,再渲染
renderDashboard({ user, notifications, settings });
} catch (err) {
console.error('部分数据加载失败:', err);
}
}
处理条件分支或可选步骤
实际业务中常有“如果用户是 VIP,再额外加载会员权益”这类逻辑。Promise 支持在 .then() 或 async 函数中动态决定下一步。
技巧:
- 在
await后加if判断,再决定是否await下一个 Promise; - 把可选请求包装成函数,返回 Promise,避免提前执行;
- 用
Promise.resolve()或空async () => ({})占位,保持链路结构一致。
示例:
立即学习“Java免费学习笔记(深入)”;
async function loadFullProfile(userId) {
const user = await fetch(`/api/user/${userId}`).then(r => r.json());
let vipBenefits = null;
if (user.isVip) {
vipBenefits = await fetch(`/api/vip/benefits?userId=${userId}`)
.then(r => r.json());
}
return { user, vipBenefits };
}

















