JavaScript手写最大并发请求数?

作者站长头像
站长
· 阅读数 20
function request1() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(1);
    }, 100);
  });
}
function request2() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(2);
    }, 800);
  });
}
function request3() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(3);
    }, 500);
  });
}
function request4() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(4);
    }, 1000);
  });
}

function schedular(max) {
  // TODO
  // code write here
}

const addReques = schedular(2);

addReques(request1).then((res) => {
  console.log(res);
});
addReques(request2).then((res) => {
  console.log(res);
});
addReques(request3).then((res) => {
  console.log(res);
});
addReques(request4).then((res) => {
  console.log(res);
});

如果是schedular传入一个请求数组写最大并发请求数我会,但是这种怎么实现和那个一样的效果?就是这里加入 max 是2,那么最多就只能同时执行2个请求,等到有一个请求完成后,才能进行后面的请求执行

回复
1个回答
avatar
test
2024-07-16

简单实现了一下 可以作为参考

  function schedular(max) {
      const executing = [];
      const fns = new Map();
      const execFn = async () => {
        for (const fn of fns.keys()) {
          if (max <= fns.size) {
            const { resolve, reject } = fns.get(fn);
            const e = Promise.resolve()
              .then(fn)
              .then(resolve, reject)
              .finally(() => {
                executing.splice(executing.indexOf(e), 1);
              });
            executing.push(e);
            if (executing.length >= max) {
              await Promise.race(executing);
            }
          }
        }
      };

      const addReques = (fn) => {
        return new Promise((resolve, reject) => {
            fns.set(fn, { resolve, reject });
        });
      };
      setTimeout(execFn, 0);
      return addReques;
    }
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容