promise链式调用可避免回调地狱,需每个异步操作封装为返回promise的函数,用.then()平铺串联、.catch()统一错误处理,并行任务用promise.all。

用 Promise 链式调用代替多层回调嵌套,是避免回调地狱最直接有效的方式。关键不是“用了 Promise”,而是写法是否真正解耦了依赖关系、是否统一了错误处理、是否合理区分了串行与并行逻辑。
把每个异步操作封装成返回 Promise 的函数
这是链式调用的前提。不能在回调里再写回调,而要让每个步骤都返回一个 Promise,供下一个 .then() 消费。
- 每个请求函数(如 fetchUser、fetchPosts)必须返回 new Promise(...),内部用 resolve/reject 显式控制状态
- 避免“先执行异步操作,再包 Promise”——比如不能先 setTimeout(...) 再 return new Promise,必须把异步逻辑放进 executor 函数里
- 同步错误(如 JSON.parse 失败)不会自动触发 reject,需手动 try/catch + reject
用 .then() 平铺串联,别在 .then() 里再嵌套回调
错误示范:在 .then() 回调里又写一个 setTimeout 或另一个 fetch 的回调;正确做法是直接返回新的 Promise,让链自动接续。
- 每个 .then() 只做一件事:处理上一步结果,并返回下个 Promise 或值
- 返回值会自动传给下一个 .then();返回 Promise 则自动等待它完成
- 不要混用 return 和 throw,容易漏掉错误分支;出错时统一 reject 或 throw,交给 .catch()
并行任务用 Promise.all,别串行等三次
如果多个请求之间无依赖(比如同时拉用户信息、配置项、公告),就该并发发起,而不是写成 .then().then().then()。
- Promise.all([p1, p2, p3]) 返回一个新 Promise,所有子 Promise 都成功才 fulfilled,任一失败则整体 rejected
- 需要部分失败仍继续的场景,可用 Promise.allSettled
- 避免为图省事把本可并行的请求硬写成串行链,白白拖慢响应时间
错误统一收口,别每个步骤都写 try/catch
.catch() 能捕获链中任意环节的 rejection,包括 reject()、throw、或 Promise 构造中未处理的异常(前提是没被中间 .catch() 吃掉)。
- 链尾加一个 .catch(err => {...}) 就能兜住前面所有异步步骤的错误
- 避免在每个 .then() 里重复写错误处理逻辑,既冗余又容易遗漏
- 注意:.catch() 不捕获 .then() 内部的同步异常(除非你主动 throw),所以业务逻辑仍需基本防护
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











