Promise.all中如何确保首个Promise先完成再执行第二个?
如何让第二个Promise等待第一个完成后再执行?
问题分析
你当前用Promise.all同时启动两个Promise,由于getSecondPromiseData是本地立即resolve的Promise,它会比从数据库取数据的第一个Promise更早完成,此时data还没被第一个Promise的then回调更新,所以拿到空对象。核心解决思路是让第二个Promise在第一个完全执行完成后再启动。
解决方案1:串行执行(直观易读)
直接用await依次执行两个Promise,确保时序:
let data = {}; // 先等待第一个Promise完成,更新data const firstResult = await this.service1.getFirstPromiseData(); data = { ...firstResult }; // 再执行第二个Promise,此时data已包含第一个的结果 const secondResult = await this.getSecondPromiseData(); data = { ...secondResult, ...data };
解决方案2:链式调用(更符合Promise设计)
避免依赖全局data变量,直接通过Promise链式传递结果,代码更健壮:
// 第一个Promise完成后,再执行第二个并合并结果 const data = await this.service1.getFirstPromiseData() .then(firstResult => { return this.getSecondPromiseData().then(secondResult => { return { ...secondResult, ...firstResult }; }); });
也可以用async/await简化链式写法:
const firstResult = await this.service1.getFirstPromiseData(); const secondResult = await this.getSecondPromiseData(); const data = { ...secondResult, ...firstResult };
原代码问题说明
Promise.all的作用是等待所有传入的Promise同时并行执行完成,它不会保证执行顺序。你的第二个Promise因为是本地立即resolve的,所以会先完成,此时第一个Promise还在数据库请求过程中,data还是初始空对象,导致结果不符合预期。
内容的提问来源于stack exchange,提问作者s.khan
相关产品推荐
相关产品推荐

