Skip to content

异步最大并发请求并按顺序组成结果

js
async function concurrentOrderedRequests(requests, maxConcurrent = 5) {
  const results = new Array(requests.length); // 预定义结果数组
  let currentIndex = 0; // 当前处理的任务索引

  // 创建工作线程函数
  async function worker() {
    while (currentIndex < requests.length) {
      const index = currentIndex++; // 原子性获取任务索引
      const request = requests[index];
      
      try {
        results[index] = await request(); // 保持结果顺序的关键
      } catch (error) {
        results[index] = error; // 错误处理
      }
    }
  }

  // 创建并执行工作线程池
  const workers = Array(Math.min(maxConcurrent, requests.length))
    .fill().map(worker);
  
  await Promise.all(workers); // 等待所有任务完成
  return results;
}
js
// 模拟异步请求函数
const createRequest = (time, value) => () => 
  new Promise(resolve => 
    setTimeout(() => resolve(value), time)
  );

// 创建测试请求队列
const requests = [
  createRequest(3000, '请求1'),
  createRequest(1000, '请求2'),
  createRequest(2000, '请求3'),
  createRequest(500, '请求4')
];

// 执行并获取结果
concurrentOrderedRequests(requests, 2)
  .then(results => {
    console.log('最终结果顺序:');
    results.forEach((res, i) => 
      console.log(`[请求${i+1}]`, res)
    );
  });

/* 输出(耗时约3秒):
最终结果顺序:
[请求1] 请求1
[请求2] 请求2
[请求3] 请求3
[请求4] 请求4
*/