promise综合实战需兼顾串行依赖、并行提效、错误兜底与状态反馈:用async/await实现清晰串行链,promise.all并发独立请求,分层错误处理转化界面提示,加载状态全程可视化。

Promise 综合实战不是堆砌语法,而是围绕真实协作场景组织异步逻辑:串行依赖、并行提效、错误兜底、状态反馈四者缺一不可。核心是让异步行为可预期、可调试、可维护。
串行请求:用 async/await 写清依赖链
当后一步必须等前一步结果(如“查用户 → 查该用户的订单 → 查订单商品”),强行用 Promise.all 会出错,而嵌套 .then 又难读。正确做法是:
- 用 async 函数包裹整个流程,每步 await 一个 Promise
- 把错误统一收在 try/catch 里,避免每个 .then 都写 .catch
- 中间值直接赋变量,不靠链式传参,逻辑更直白
示例:
try {
const user = await fetchUser(userId);
const orders = await fetchOrders(user.id);
const goods = await fetchGoods(orders[0]?.goodsId);
return { user, orders, goods };
} catch (err) {
throw new Error(`加载失败:${err.message}`);
}
}
并行请求:用 Promise.all 提速,但别误用
多个互不依赖的请求(如首页同时拉取轮播图、公告、用户权限)适合并发执行。关键不是“用了 all”,而是用得对:
- 只对真正独立的任务用 Promise.all;有依赖关系的必须拆开
- 注意 fail-fast 特性:一个失败,整个 all 就中断——若需“全部执行完再汇总结果”,改用 Promise.allSettled
- 提前包装好每个请求函数,确保返回 Promise,避免传入非 Promise 值
示例:
const [banners, notices, perms] = await Promise.all([fetchBanners(),
fetchNotices(),
fetchPermissions()
]);
错误处理:分层兜底,不只靠 console.log
用户看不到控制台,所以错误必须转化为界面反馈:
- 网络请求层:fetch 包一层,自动判断 response.ok,抛出业务错误
- 业务逻辑层:async 函数内 try/catch,捕获后调用统一提示函数(如 showToast 或更新 error 状态)
- 全局兜底:window.addEventListener('unhandledrejection') 捕获漏网的 Promise 错误
避免写法:.catch(err => console.error(err)) —— 这等于没处理。
加载状态:Promise 生命周期要可视化
异步操作期间,UI 必须反映真实状态,否则用户会重复点击或以为卡死:
- 发起请求前设 loading = true,成功或失败后设 loading = false
- 按钮加 disabled + 文字变化(如“提交中…”),防止重复提交
- 空数据状态(如列表为空)、错误重试按钮,都应随 Promise 状态同步更新
示例(React 类似逻辑):
const [loading, setLoading] = useState(false);const [data, setData] = useState(null);
const [error, setError] = useState(null);
const loadData = async () => {
setLoading(true);
setError(null);
try {
const res = await fetchApi();
setData(res);
} catch (err) {
setError(err.message);
} finally {
setLoading(false);
}
};











