Promise链式调用通过将异步操作封装为返回Promise的函数并用.then()串联,避免回调地狱;错误统一由.catch()处理;async/await为其语法糖,使代码更简洁易读。

用 Promise 链式调用替代多层嵌套回调,核心是把每个异步操作封装成返回 Promise 的函数,再用 .then() 逐级传递结果,避免“回调地狱”。
把回调函数转成返回 Promise 的函数
原生 API(如 setTimeout、XMLHttpRequest)或老式 Node.js 回调风格(如 fs.readFile)默认不返回 Promise。需要手动包装:
- 用
Promise构造函数包裹,成功时调用resolve(value),失败时调用reject(error) - 现代环境可直接用
util.promisify()(Node.js)或fetch(浏览器),它们原生返回 Promise
例如:
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));用 .then() 串联异步任务
每个 .then() 接收上一个 Promise 的成功结果,并可返回新值或新 Promise:
立即学习“Java免费学习笔记(深入)”;
- 返回普通值 → 下一个
.then()收到该值 - 返回 Promise → 下一个
.then()等待它完成后再接收其结果 - 不返回(或返回
undefined)→ 下一个.then()收到undefined
这样就能把原本三层回调写成平铺的链式调用。
错误统一用 .catch() 处理
链中任意一环抛出异常或 Promise 被 reject,都会跳过后续 .then(),直接进入最近的 .catch():
- 推荐在链末尾加一个
.catch(),集中处理所有可能的错误 - 也可在中间某步加
.catch()局部捕获并恢复流程(比如兜底数据)
注意:不要在每个 .then() 里写 try/catch,那对 Promise 异步错误无效。
进阶:用 async/await 让链更自然
async/await 是 Promise 链的语法糖,让异步代码看起来像同步:
- 函数加
async后自动返回 Promise -
await只能在async函数内使用,会暂停执行直到 Promise 完成 - 多个
await自动形成隐式链,比手写.then()更易读
例如:async function loadUser() { const data = await fetch('/user'); return await data.json(); }


















