详解JavaScript如何控制并发请求数量

作者:青柠时间:2026-10-31 10:35:10浏览:471

本文详解如何在JavaScript中通过缓冲队列控制多个异步任务的并发执行数量。通过自定义类管理任务队列,限制同时运行的Promise数量,实现任务完成后的自动追加。文章包含完整代码示例及不同maxLen配置下的耗时效果对比,帮助开发者深入理解异步编程与并发控制。

概述

在某些场景下,我们需要对多个异步任务的执行数量进行限制,仅允许固定数量的任务同时运行。当部分任务完成后,系统会自动从缓冲队列中追加新的异步任务,直到队列填满,最终所有任务执行完毕后停止。

代码

class BufferControl {
  bufferList = []; //缓冲队列
  maxLen = 1; //当前允许执行的最大并发数量
  currentQueenCount = 0; //当前正在执行的任务数量
  add(fn) {
    this.bufferList.push(fn);
    this.run();
  }

  run() {
    if (!this.bufferList.length) {
      return;
    }
    while (this.bufferList.length && this.currentQueenCount < this.maxLen) {
      let fn = this.bufferList.shift();
      this.currentQueenCount++;
      fn().then(() => {
        this.currentQueenCount--;
        this.run();
      });
    }
  }
}

let queen = new BufferControl();

// 定义几个异步任务
let fn1 = () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log('fn1', 1000);
      resolve();
    }, 1000);
  });
};
let fn2 = () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log('fn2', 2000);
      resolve();
    }, 1000);
  });
};
let fn3 = () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log('fn3', 3000);
      resolve();
    }, 1000);
  });
};
let fn4 = () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log('fn4', 4000);
      resolve();
    }, 1000);
  });
};
// 追加到缓冲队列中
queen.add(fn1);
queen.add(fn2);
queen.add(fn3);
queen.add(fn4);

效果

最终效果表现为每隔1秒打印一次异步任务的结果,全部异步任务在4秒后执行完毕。

概述

若将属性的值改为2,则总耗时将缩短为2秒,每秒分别打印两次任务结果。

总结

异步任务的数量和时间通常是不确定的,我们可以根据实际需求自行设置相关参数。关键在于对的深入理解与灵活运用。

到此这篇关于详解JavaScript如何控制并发请求数量的文章就介绍到这了,更多相关JavaScript控制并发请求内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

作者最新文章