let urls = ['bytedance.com','tencent.com','alibaba.com','microsoft.com','apple.com','hulu.com','amazon.com']
let pool = []
let dataArr=[]
let max = 3
var request = url => {
return new Promise(resolve => {
setTimeout(() => {
resolve(`任务${url}完成`)
}, 1000)
})
}
while (pool.length <= max) {
let url = urls.shift();
addTask(url)
}
function addTask(url){
let task = request(url);
pool.push(task);
task.then(res => {
dataArr.push({
url,
res,
})
console.log('外部逻辑', res);
pool.splice(pool.indexOf(task), 1);
console.log(`${url} 结束,当前并发数:${pool.length}`);
url = urls.shift();
if(url !== undefined){
addTask(url);
}
else if(!pool.length){
console.log(dataArr)
}
})
}
async function promiseAllLimit(limit, array, apiFn) {
const ret = []
const executing = []
for (const item of array) {
const p = apiFn(item)
ret.push(p)
console.log(limit <= array.length,limit,array.length)
if (limit <= array.length) {
const e = p.then(() => executing.splice(executing.indexOf(e), 1))
executing.push(e)
if (executing.length >= limit) {
await Promise.race(executing)
}
}
}
return Promise.all(ret)
}
function run(max){
for (let i=0;i<max;i++){
let url =urls.shift()
console.log(url,'url')
send(url,request(url));
}
}
function send(url,promise){
pool.push(promise);
promise.then((res)=>{
console.log(`id${res}的请求已经处理完毕,当前并发${pool.length}`);
pool.splice(pool.indexOf(promise),1);
let id = urls.shift();
console.log(id,11)
if (id !==undefined){
send(request(id));
}
})
}
console