当多个请求时,控制请求并发。

73 阅读1分钟

编写并发请求控制类

// Description: 并发控制
class SuperTask {
    //  在构造函数中可以传入并发数,默认为2
    constructor(parallelCount = 2) {
        this.parallelCount = parallelCount; // 并发数
        this.tasks = []; // 任务队列
        this.runningCount = 0; // 正在运行的任务数
    }

    _run() {
        // 如果正在运行的任务数小于并发数,并且任务队列有值,就执行任务
        while (this.runningCount < this.parallelCount && this.tasks.length) {
            const { task, resolve, reject } = this.tasks.shift();
            this.runningCount++; // 正在执行的任务数加一
            Promise.resolve(task())
                .then(resolve, reject)
                .finally(() => {
                    this.runningCount--; // 正在执行的任务数减一
                    this._run(); // 继续执行任务
                });
        }
    }

    add(task) {
        return new Promise((resolve, reject) => {
            // 将任务加入任务队列
            this.tasks.push({ task, resolve, reject });
            // 每次添加任务完成后,立即触发执行任务,检查是否可以执行
            this._run();
        });
    }
}

测试使用

// 设置并发数为2
const superTask = new SuperTask(2);

// 模拟请求
function request(time) {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve(time);
        }, time);
    });
}

// 添加任务
function addTask(time) {
    superTask
        .add(() => request(time * 100))
        .then(data => {
            // 处理返回的数据
            console.log(`任务${time}执行完毕`);
            console.log(data);
        });
}

// 设置100个任务
for (let i = 1; i < 100; i++) {
    addTask(i);
}