Skip to content

并发请求

Code

ts
/**
 * 并发请求
 * @param {string[]} urls 待请求的 url 数组
 * @param {number} maxNum 最大并发数
 */
function concurRequest(urls, maxNum) {
  return new Promise((resolve) => {});
}

解析

ts
function concurRequest(urls, maxNum) {
  if (urls.length === 0) return Promise.resolve([]);
  return new Promise((resolve) => {
    let index = 0; // 指向下一次请求的 url 对应的下标
    const result = []; // 存储所有请求的结果
    async function _request() {
      const i = index;
      const url = urls[index];
      index++;
      try {
        const resp = await fetch(url);
        result.push({
          index: i,
          response: resp
        })
      } catch (err) {
         result.push({
          index: i,
          response: err
        })
      } finally {
        if (result.length === urls.length) {
          resolve(result.sort((a, b) => a.index - b.index).map(x => x.response))
        }
        if (index < urls.length) {
          _request();
        }
      }
    }

    for (let i = 0, len = Math.min(maxNum, urls.length); i < len; i ++) {
      _request();
    }
  });
}