前端面试题 - 108. 实现一个带有限流功能的批量请求函数(BatchRequest)

370 阅读1分钟

接收一组异步请求任务和最大并发数,确保同时最多只有指定数量的请求在执行。

关键点:返回一个Promise。然后通过makeRequest计数执行,超出上限并且都执行了就resolve。否则取出任务数组对应的任务执行,记录状态。finally的时候递归。

function batchRequest(requests, maxConcurrency) {
  return new Promise((resolve, reject) => {
    const results = [];
    let completedCount = 0;
    let currentIndex = 0;

    function makeRequest(index) {
      if (index >= requests.length) {
        if (completedCount === requests.length) {
          resolve(results);
        }
        return;
      }

      const currentRequest = requests[index];
      currentRequest()
        .then((result) => {
          results[index] = result;
        })
        .catch((error) => {
          results[index] = error;
        })
        .finally(() => {
          completedCount++;
          makeRequest(currentIndex++);
        });

      if (currentIndex - index < maxConcurrency) {
        makeRequest(currentIndex++);
      }
    }

    makeRequest(0);
  });
}