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

JavaScript中是否有asyncio.as_completed等价实现?能否自行实现该逻辑?

JavaScript Promise 原生方法对比
  • Promise.all:仅在所有Promise都resolve时才resolve,第一个Promise reject时立即reject
  • Promise.allSettled:需等所有Promise完成(无论resolve/reject)后才resolve
  • Promise.any:第一个Promise resolve时立即resolve,所有Promise都reject时才reject
  • Promise.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 19:47:49