SOURCE

// 模拟ajax请求
function majax(url) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            const res = {
                req: url,
                res: `回应:${url}`
            }
            resolve(res);
        }, 2000);
    })
}

// 批量请求切控制并发数
function multiRequest(urls, maxNum) {
    return new Promise((resolve, reject) => {
        let _urls = [...urls]
        let stackNum = 0;
        let _rsl = [];
        // 添加一个新的请求
        let addXhr = function () {
            // 队列已满或没有待请求
            if (stackNum >= maxNum || _urls.length == 0) return;
            const __path = _urls.shift();
            stackNum++;
            console.log(`begin!`)
            majax(__path).then(res => {
                _rsl.push(res)
                console.log(`over!`)
                stackNum--;
                if (stackNum == 0 && _urls.length == 0) {
                    // 所有请求全部返回完毕
                    resolve(_rsl);
                } else {
                    addXhr();
                }
            })
        }

        while (stackNum < maxNum) {
            addXhr();
        }
    })
}

const urls = [
    'https://wwww.baidu.com1',
    'https://wwww.baidu.com2',
    'https://wwww.baidu.com3',
    'https://wwww.baidu.com4',
    'https://wwww.baidu.com5',
]
multiRequest(urls, 1).then(res => {
    console.log(res, 'res------')
})
console 命令行工具 X clear

                    
>
console