单Promise的then()是否一定早于Promise.all()的then()执行?
结论
你当前的写法执行顺序不可靠,无法保证单个Promise绑定的then回调全部执行完成后再触发Promise.all的then回调,你之前测试生效只是特定场景下的巧合。
原因说明
Promise.all监听的是你传入的原始Promise实例,只要原始Promise本身resolve,Promise.all就会进入自身的触发流程,不会等待你额外绑定的then回调执行完成。- 如果你在单个
then回调中写了异步逻辑(比如接口请求、定时器、异步IO等),Promise.all的回调完全可能在这些异步逻辑执行完成前就触发。 - 即使你单个
then里全是同步逻辑,执行顺序也依赖于回调的绑定时机,不属于规范层面的可靠保证,不适合作为生产环境的依赖逻辑。
反例验证
运行以下代码可以直观看到问题:
const promise1 = Promise.resolve(1); const promise2 = Promise.resolve(2); promise1.then(res => { // 模拟异步处理逻辑 return new Promise(resolve => setTimeout(() => { console.log('promise1 单独处理完成'); resolve(); }, 1000)); }); promise2.then(res => { console.log('promise2 单独处理完成'); }); Promise.all([promise1, promise2]).then(res => { console.log('Promise.all 回调执行'); });
执行结果顺序为:
promise2 单独处理完成 Promise.all 回调执行 // 间隔1秒后才输出 promise1 单独处理完成
完全不符合你的需求。
正确实现方案
把每个Promise调用then后返回的新Promise实例传给Promise.all即可,Promise.all会自动等待所有then回调(包括其中的异步逻辑)执行完成后再触发自身回调,顺序100%符合规范要求:
// 保存每个Promise执行单独处理后返回的新实例 const processedP1 = promise1.then(results => { // 你的单个资源处理逻辑 }); const processedP2 = promise2.then(results => { // 你的单个资源处理逻辑 }); // 传入处理后的Promise实例 Promise.all([processedP1, processedP2]) .then(results => { // 所有单独处理都完成后,执行应用启动逻辑 });
内容的提问来源于stack exchange,提问作者Yosko
相关产品推荐
相关产品推荐

