编辑代码

//JSRUN引擎2.0,支持多达30种语言在线运行,全仿真在线交互输入输出。 
// promise并行数量控制-递归版本
// 请求多个地址,限制并发数量 
const urls =  [
    {
        link: 'bytedance.com',
        time: 1000
    },
    {
        link: 'tencent.com',
        time: 3000
    },
    {
        link: 'alibaba.com',
        time: 2000
    },
    {
        link: 'microsoft.com',
        time: 1000
    },
    {
        link: 'apple.com',
        time: 4000
    },
    {
        link: 'hulu.com',
        time: 3000
    },
    {
        link: 'amazon.com',
        time: 2000
    }
] // 请求地址

// 辅助函数,生成模拟请求的promise
const request = url => {
    return new Promise(resolve => {
        console.log(`开始执行: ${url.link}-${url.time}`)
        setTimeout(() => {
            resolve(url)
            // resolve(`完成执行: ${url.link}-${url.time}: `)
        }, url.time)
    })
}

// 编写:并发请求函数
const concurrentNum = 3
let concurrentTaskNum = 0
const taskAmount = urls.length
const result = []

function addTask(url) {
    
    const task = request(url)
    task.then(res => {
        console.log(` - 完成执行: ${res.link}-${res.time}`)
        const url = urls.shift()
        if(url) {
            addTask(url)
        }

        result.push(res)
        if(result.length === taskAmount) {
            console.log('全部执行完成')
        }
    })
}


while(concurrentTaskNum < concurrentNum) {
    const url = urls.shift()
    addTask(url)
    concurrentTaskNum++
}