如何按resolve时间顺序返回多个带不同setTimeout的Promise结果?
按Promise resolve时间顺序返回结果
要实现按Promise实际resolve的时间顺序返回结果,不能直接使用Promise.all(它会保持原数组顺序),需要先跟踪每个Promise的完成时间,再排序结果。以下是具体实现方案:
解决思路
- 包装Promise:给每个Promise添加完成时间的记录,让resolve时返回包含结果和完成时间的对象。
- 等待全部完成:用
Promise.all等待所有包装后的Promise执行完毕。 - 按时间排序:根据记录的完成时间对结果数组排序,最后提取纯结果数据。
修改后的代码
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
相关产品推荐
相关产品推荐

