首页接口应并行加载以缩短总耗时,需识别无依赖关系的请求(如用户信息、轮播图、商品列表),用Promise.all实现全成功并发,Promise.allSettled处理部分失败,同时通过loginPromise解耦登录与首页请求。

首页接口请求做到并行加载,核心是打破“一个接一个”的串行习惯,让多个无依赖关系的请求同时发出。这能显著缩短总耗时——尤其当各接口响应时间在300–800ms之间时,并行可将3秒串行压缩到1秒内。
识别可并行的接口
不是所有接口都能随便并行。关键看数据间是否存在强依赖:
- ✅ 可并行:用户信息、未读消息、首页轮播图、推荐商品列表(彼此不依赖ID或状态)
- ❌ 不宜并行:先查用户ID → 再用该ID查订单 → 再用订单号查物流(存在链式依赖)
- ⚠️ 需协调:部分接口需登录态,但登录本身异步——应确保token已就绪再发起业务请求(见下文“登录与首页解耦”)
用 Promise.all 并发请求
这是最常用、兼容性好、语义清晰的方式。适用于全部成功才继续的场景:
async onLoad() {
try {
const userInfo = await fetchUserInfo(); // 先拿基础信息(如需用于其他请求)
const [banner, products, notifications] = await Promise.all([
fetchBanner(),
fetchProducts({ limit: 6 }),
fetchNotifications()
]);
this.setData({ userInfo, banner, products, notifications });
} catch (err) {
console.error('并行请求失败', err);
}
}
用 Promise.allSettled 处理部分失败
当某个接口失败不应阻断整个首页渲染(比如轮播图挂了,商品列表仍要展示),就用 allSettled:
- 每个请求独立完成,无论成功或失败都返回结果对象
- 前端可按 key 区分处理:成功则渲染,失败则展示默认内容或空占位
- 适合对稳定性要求高、模块化程度强的首页
登录与首页请求解耦
小程序/UniApp常见问题:首页 onLoad 比 app.onLaunch 中的静默登录更快,导致请求带空 token 失败。解决思路是让首页等待登录完成,而非自己重试或延迟:
- 在 app.vue 的 onLaunch 中创建并暴露一个 Promise(如 getApp().loginPromise)
- 登录成功 resolve(true),失败 resolve(false) 或 reject
- 首页 onLoad 中 await 这个 Promise,再发起业务接口
- 避免 setTimeout 硬等,也避免重复调登录接口
不复杂但容易忽略:并行不是盲目堆请求,而是理清依赖、选对工具、兜住异常。真正落地时,配合接口合并(如后端提供 /home-summary 接口)、CDN加速静态资源、首屏数据预加载,效果更稳。


















