promise 通过链式调用避免回调地狱,封装异步操作为返回 promise 的函数,用 then() 传递数据、catch() 捕获错误,async/await 进一步简化语法,需注意 return、错误处理及并行串行区别。

Promise 能把层层嵌套的回调函数,变成清晰的链式调用,从根本上避免回调地狱。
用 Promise 封装异步操作
回调地狱的根源在于多个异步任务依赖前一个结果,而传统回调写法导致缩进越来越深。Promise 提供统一的异步处理接口,把每个异步操作包装成返回 Promise 的函数:
- 用 new Promise() 包裹异步逻辑,内部通过 resolve() 或 reject() 控制状态
- 封装后的函数不再接收回调参数,而是直接返回 Promise 实例
- 例如:fetchUser().then(user => fetchPosts(user.id)).then(posts => render(posts))
用 then() 链式传递数据
每个 then() 方法接收上一个 Promise 的成功结果,并可返回新 Promise 或普通值,自动向下传递:
- 返回普通值(如字符串、对象)时,下一个 then() 会接收到该值
- 返回新 Promise 时,下一个 then() 会等待它完成后再执行
- 错误不会中断整条链,而是跳转到最近的 catch(),避免层层 try-catch
用 async/await 进一步简化
async/await 是 Promise 的语法糖,让异步代码看起来像同步代码:
- 在函数前加 async,内部可用 await 等待 Promise 完成
- await 后面可以是 Promise 或任意值,遇到 Promise 会暂停执行直到 resolve
- 错误可用 try/catch 统一捕获,比嵌套 then().catch().catch() 更直观
避免常见陷阱
Promise 强大但容易误用:
- 忘记 return:在 then() 回调里漏掉 return,会导致后续 then 接收 undefined
- 错误没处理:不加 catch() 或 try/catch,未捕获的 rejection 会静默失败
- 并行与串行混淆:多个独立请求用 Promise.all() 并发,有依赖关系才用链式调用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











