Promise链式调用需正确返回Promise、避免嵌套、统一错误处理;async/await是其语法糖,提升可读性;错误应集中捕获,无依赖请求宜用Promise.all并发。

Promise 链式调用本身就是为了避免回调地狱而设计的,关键在于**正确返回 Promise、避免嵌套、统一错误处理**。只要不手动在 .then() 里写新的 new Promise 或嵌套 .then(),就能有效跳出回调地狱。
始终返回 Promise(或可被 resolve 的值)
每个 .then() 回调里,如果要继续链式调用,必须返回一个 Promise(比如 fetch()、Promise.resolve())或同步值(会被自动包装成 resolved Promise)。否则后续 .then() 接收到的是 undefined,无法继续异步流程。
✅ 正确示例:
fetch('/api/user')
.then(res => res.json())
.then(user => fetch(`/api/posts?userId=${user.id}`))
.then(res => res.json())
.then(posts => console.log(posts))
.catch(err => console.error('出错了:', err));
❌ 错误示例(隐式中断链):
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
fetch('/api/user')
.then(res => {
const user = res.json();
// 忘了 return,这里返回 undefined
fetch(`/api/posts?userId=${user.id}`).then(...); // 嵌套!回调地狱苗头
});
用 async/await 替代长链(更直观)
对于多步依赖操作,async/await 是 Promise 链的语法糖,让异步代码像同步一样阅读,天然消除嵌套。
- 每个
await后面必须是 Promise - 用
try/catch统一捕获任何一步的 rejection - 避免在
await后再套.then(),否则又绕回链式嵌套
✅ 推荐写法:
async function loadUserData() {
try {
const userRes = await fetch('/api/user');
const user = await userRes.json();
const postsRes = await fetch(`/api/posts?userId=${user.id}`);
const posts = await postsRes.json();
console.log(posts);
} catch (err) {
console.error('加载失败:', err);
}
}
错误处理别分散,用单个 .catch() 或 try/catch
不要每个 .then() 都配一个 .catch(),那样会割裂流程、掩盖问题。Promise 链中任意一步 reject,都会跳过后续所有 .then(),直达最近的 .catch()。
- 链式调用:把
.catch()放在末尾,覆盖整条链 -
async/await:用try/catch包住全部await表达式 - 需要局部容错?用
.catch(() => {/* 返回默认值 */})把错误“消化”掉,保持链继续
并行任务用 Promise.all(),别串行嵌套
如果多个请求无依赖关系,却写成 .then(() => fetch(...)).then(() => fetch(...)),属于人为拉长耗时,也容易写出深层嵌套。应优先考虑并发。
-
Promise.all([fetch(a), fetch(b), fetch(c)])同时发起,最快等全部完成 - 部分失败不影响整体?用
Promise.allSettled() - 有依赖又想并发?先
await依赖项,再Promise.all()并发其余

















