SOURCE

// 并发请求函数
const concurrencyRequest = (urls, maxNum) => {
    return new Promise((resolve) => {
        if (urls.length === 0) {
            resolve([]);
            return;
        }
         // maxNum和urls.length取最小进行调用
        const times = Math.min(maxNum, urls.length);
        // 第一次调用
        for(let i = 0; i < times; i++) {
            request();
        }

        const results = [];
        let index = 0; // 下一个请求的下标
        let count = 0; // 当前请求完成的数量

        // 发送请求
        async function request() {
            if (index === urls.length) return;
            const i = index; // 保存序号,使result和urls相对应
            const url = urls[index];
            index++;
            console.log(url);
            try {
                const resp = await fetch(url);
                // resp 加入到results 推入微任务里
                results[i] = resp;
            } catch (err) {
                // err 加入到results
                results[i] = err;
            } finally {
                count++;
                // 判断是否所有的请求都已完成
                if (count === urls.length) {
                    console.log('完成了');
                    resolve(results);
                }
                // 递归调用
                request();
            }
        }
    })
}


// class版本 并且可以决定什么时候开始调用
// https://github.com/z-memo/interview/issues/181
console 命令行工具 X clear

                    
>
console