JavaScript中是否有asyncio.as_completed等价实现?能否自行实现该逻辑?
JavaScript Promise 原生方法对比
Promise.all:仅在所有Promise都resolve时才resolve,第一个Promise reject时立即rejectPromise.allSettled:需等所有Promise完成(无论resolve/reject)后才resolvePromise.any:第一个Promise resolve时立即resolve,所有Promise都reject时才rejectPromise.race:以第一个完成(resolve或reject)的Promise结果确定自身状态
看起来JavaScript原生Promise没有对应Python asyncio.as_completed 的方法——该方法会按Promise完成的先后顺序依次返回结果。
能否自定义实现等价于asyncio.as_completed的逻辑?
可以,通过异步生成器结合Promise.race就能实现,核心思路是持续跟踪未完成的Promise,每次取出第一个完成的结果并返回,直到所有Promise处理完毕:
async function* asCompleted(promises) { // 存储包装后的Promise,每个Promise完成后会携带状态和结果 const pending = new Set( promises.map(p => p.then( res => ({ status: 'fulfilled', value: res, source: p }), err => ({ status: 'rejected', reason: err, source: p }) ) ) ); while (pending.size > 0) { // 等待第一个完成的Promise const settled = await Promise.race(pending); // 从待处理集合中移除已完成的Promise pending.delete(settled); // 根据状态返回结果或抛出错误 if (settled.status === 'fulfilled') { yield settled.value; } else { throw settled.reason; } } }
使用示例
// 模拟不同延迟的异步任务 const tasks = [ new Promise(resolve => setTimeout(() => resolve('任务1完成'), 3000)), new Promise(resolve => setTimeout(() => resolve('任务2完成'), 1000)), new Promise(resolve => setTimeout(() => resolve('任务3完成'), 2000)) ]; // 按完成顺序获取结果 (async () => { try { for await (const result of asCompleted(tasks)) { console.log(result); // 输出顺序:任务2完成 → 任务3完成 → 任务1完成 } } catch (error) { console.error('任务失败:', error); } })();
这个实现和asyncio.as_completed行为一致:
- 严格按Promise完成的先后顺序返回结果
- 若某个Promise reject,迭代会立即抛出该错误(若需忽略错误,可在传入Promise时自行添加
catch处理)
内容的提问来源于stack exchange,提问作者Mehdi Saffar
相关产品推荐
相关产品推荐

