You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按resolve时间顺序返回多个带不同setTimeout的Promise结果?

按Promise resolve时间顺序返回结果

要实现按Promise实际resolve的时间顺序返回结果,不能直接使用Promise.all(它会保持原数组顺序),需要先跟踪每个Promise的完成时间,再排序结果。以下是具体实现方案:

解决思路

  1. 包装Promise:给每个Promise添加完成时间的记录,让resolve时返回包含结果和完成时间的对象。
  2. 等待全部完成:用Promise.all等待所有包装后的Promise执行完毕。
  3. 按时间排序:根据记录的完成时间对结果数组排序,最后提取纯结果数据。

修改后的代码

const P1 = new Promise((resolve) => {
  setTimeout(() => resolve('R1'), 3000);
});

const P2 = new Promise((resolve) => {
  setTimeout(() => resolve('R2'), 5000);
});

const P3 = new Promise((resolve) => {
  setTimeout(() => resolve('R3'), 1000);
});

async function fetchInitialData(arr) {
  // 包装每个Promise,记录结果与完成时间
  const wrappedPromises = arr.map(promise => 
    promise.then(result => ({ result, resolvedAt: performance.now() }))
  );
  
  // 等待所有Promise完成
  const resolvedData = await Promise.all(wrappedPromises);
  
  // 按完成时间升序排序
  resolvedData.sort((a, b) => a.resolvedAt - b.resolvedAt);
  
  // 提取最终结果数组
  return resolvedData.map(item => item.result);
}

fetchInitialData([P1, P2, P3])
  .then((data) => {
    console.log('result', data); // 输出: result [ 'R3', 'R1', 'R2' ]
  });

关键说明

  • performance.now()比Date.now()精度更高,能更准确区分Promise的完成顺序(适合对时间精度要求高的场景)。
  • 排序逻辑采用升序,确保先resolve的Promise结果排在前面。
  • 该方案保持了Promise的并行执行特性,不会因为排序而降低效率。

内容的提问来源于stack exchange,提问作者larryfisherman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 16:55:24