SOURCE

//自定义请求函数
var request = url => {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve(`任务${url}完成`)
        }, 1000)
    }).then(res => {
        console.log('外部逻辑', res);
    })
}
// 执行任务
async function fn(){
    let urls =  ['bytedance.com','tencent.com','alibaba.com','microsoft.com','apple.com','hulu.com','amazon.com'] // 请求地址
    let pool = []//并发池
    let max = 3 //最大并发量
    for(let i=0;i<urls.length;i++){
        let url = urls[i]
        let task = request(url);
        task.then((data)=>{
            //每当并发池跑完一个任务,从并发池删除个任务
            pool.splice(pool.indexOf(task), 1)
            console.log(`${url} 结束,当前并发数:${pool.length}`);
        })
        pool.push(task); 
        if(pool.length === max){
            //利用Promise.race方法来获得并发池中某任务完成的信号
            //跟await结合当有任务完成才让程序继续执行,让循环把并发池塞满
            await Promise.race(pool)
        }
    }
    
}
fn()
console 命令行工具 X clear

                    
>
console