如何异步迭代存储Promise的Set集合?
能否异步迭代存储Promise的Set/Map集合?
可以的,Set和Map都是可迭代对象,完全支持结合async/await的for...of循环实现异步迭代,用法和数组基本一致。
针对Set集合的实现
直接用for...of遍历Set,在async函数内部逐个await每个Promise,就能实现顺序等待:
const testQueue = new Set(); const promise1 = new Promise(resolve => setTimeout(() => resolve(1), 1000)); const promise2 = new Promise(resolve => setTimeout(() => resolve(2), 500)); testQueue.add(promise1); testQueue.add(promise2); async function iterateSet() { for (const promise of testQueue) { const result = await promise; console.log('Promise结果:', result); } } iterateSet(); // 输出顺序:1(等待1秒)→ 2(再等待0.5秒)
为什么forEach不行?因为forEach的回调是同步执行的,即便在回调里写await,也只会阻塞回调本身,不会暂停forEach的遍历流程,所有Promise会被同时触发,无法实现顺序等待。
针对Map集合的实现
Map支持遍历键值对(entries)、键(keys)或值(values),根据需求选择即可:
遍历Map的values(Promise存在于值中)
const promiseMap = new Map(); promiseMap.set('task1', new Promise(resolve => setTimeout(() => resolve('任务1完成'), 1000))); promiseMap.set('task2', new Promise(resolve => setTimeout(() => resolve('任务2完成'), 500))); async function iterateMapValues() { for (const promise of promiseMap.values()) { const result = await promise; console.log(result); } } iterateMapValues(); // 输出顺序:任务1完成 → 任务2完成
遍历Map的entries(同时处理键和Promise)
async function iterateMapEntries() { for (const [key, promise] of promiseMap.entries()) { const result = await promise; console.log(`${key}:`, result); } } iterateMapEntries(); // 输出顺序:task1: 任务1完成 → task2: 任务2完成
并行执行补充(可选)
如果不需要顺序等待,想让所有Promise并行执行后统一获取结果,可通过Array.from()将Set/Map转为数组,再用Promise.all():
// Set的并行执行 const setResults = await Promise.all(Array.from(testQueue)); // Map的并行执行(获取所有值的结果) const mapResults = await Promise.all(promiseMap.values());
内容的提问来源于stack exchange,提问作者Raz Buchnik
相关产品推荐
相关产品推荐

