如果有多个接口请求,控制最大并发数。

    1. // 处理并发请求任务最大不超过max个,可以最大执行任务
    2. function Task(i) {
    3. // 必须先返回一个函数,函数再返回Promise实例
    4. // 如果直接返回Promise实例,是增加的Promise运行时的状态,全部任务会同时执行掉
    5. return () =>
    6. new Promise((resolve, reject) => {
    7. setTimeout(() => resolve(i), 1000);
    8. });
    9. }
    10. class Queue {
    11. constructor(max) {
    12. this.max = max;
    13. this.taskList = [];
    14. // 设置一个自动开始执行任务
    15. setTimeout(() => this.run());
    16. }
    17. addTask(task) {
    18. this.taskList.push(task);
    19. }
    20. run() {
    21. let len = this.taskList.length;
    22. // 取队列长度和max中的最小值,该最小值就是一次执行的数量
    23. let min = Math.min(this.max, len);
    24. if (!len) return;
    25. for (let i = 0; i < min; i++) {
    26. this.max--;
    27. let task = this.taskList.shift();
    28. task()
    29. .then((res) => console.log(res))
    30. .catch((err) => console.log(err))
    31. .finally(() => {
    32. this.max++;
    33. // 继续执行run方法
    34. this.run();
    35. });
    36. }
    37. }
    38. }
    39. let queue = new Queue(7);
    40. for (let i = 0; i < 20; i++) {
    41. const task = Task(i);
    42. queue.addTask(task);
    43. }