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
}
]
const request = url => {
return new Promise(resolve => {
console.log(`开始执行: ${url.link}-${url.time}`)
setTimeout(() => {
resolve(url)
}, url.time)
})
}
function taskConcurrentExec(list, concurrentNum) {
let num = 0
const queue = []
const result = []
return new Promise(async (resolve, reject) => {
for(let i=0;i<list.length;i++) {
const task = request(list[i])
task.then(res => {
console.log(`%c完成执行: ${res.link}-${res.time}`,'color: red;')
queue.splice(queue.indexOf(task), 1)
result[i] = res
num++
if(num === list.length){
resolve(result)
}
})
queue.push(task)
if(queue.length === concurrentNum) {
await Promise.race(queue)
}
}
})
}
const startTime = Date.now()
taskConcurrentExec(urls, 3).then(res => {
console.log(`全部执行完成,耗时${Date.now() - startTime}ms`)
console.log(res)
})