当前位置:   article > 正文

JS手写最大并发控制实现方式(主要针对类HTTP大量请求问题)_js http请求数

js http请求数
/**
 * 此问题目的为了解决类似http请求的并发量过大导致内存可能溢出的问题。
 */
function concurrentPoll() {
    this.tasks = []; // 任务队列
    this.max = 10; // 最大并发数
    // 函数主体执行完后立即执行,由于setTimeout是macrotask(宏任务),promise是microtask(微任务)
    // 所以,addTask方法添加的函数会优先执行
    setTimeout(() => {
        this.run()
    }, 0)
}

concurrentPoll.prototype.addTask = function (task) { // 原型添加任务方法
    this.tasks.push(task)
}
concurrentPoll.prototype.run = function () { // 原型任务运行方法
    if (this.tasks.length == 0) { // 判断是否还有任务
        return
    }
    const min = Math.min(this.tasks.length, this.max); // 取任务个数与最大并发数最小值
    for (let i = 0; i < min; i++) {
        this.max--; // 执行最大并发递减
        const task = this.tasks.shift(); // 从数组头部取任务
        task().then((res) => { // 重:此时可理解为,当for循环执行完毕后异步请求执行回调,此时max变为0
            console.log(res)
        }).catch((err) => {
            console.log(err)
        }).finally(() => { // 重:当所有请求完成并返回结果后,执行finally回调,此回调将按照for循环依次执行,此时max为0.
            this.max++; // 超过最大并发10以后的任务将按照任务顺序依次执行。此处可理解为递归操作。
            this.run();
        })
    }
}
const poll = new concurrentPoll(); // 实例
for (let i = 0; i < 13; i++) { // 数据模拟
    poll.addTask(function () {
        return new Promise(
            function (resolve, reject) {
                // 一段耗时的异步操作
                resolve(i + '成功') // 数据处理完成
                // reject('失败') // 数据处理出错
            }
        )
    })
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/271740
推荐阅读
相关标签
  

闽ICP备14008679号