code1
//每次调用limit个
const limitLoad = (urls,handle,limit)=>{
let _urls = Object.assign([],urls);//复制出来源,防止操作的时候误修改
let promise = _urls.splice(0,limit).map((url,index)=>{
return handle(url).then(()=>index)
})
let p = Promise.race(promise);
for(let i =0;i<_urls.length;i++){
p = p.then(index=>{
promise[index] = handle(_urls[i]).then(()=>index)
return Promise.race(promise)
})
}
}
//假设接口们
const $urls = [{
info:'url1',
time:3000
},{
info:'url2',
time:4000
},{
info:'url3',
time:1000
},{
info:'url4',
time:6000
},{
info:'url5',
time:500
},{
info:'url6',
time:7000
},{
info:'url7',
time:5000
}]
//假设调用接口的实际方法
const loadUrl = (url)=>{
return new Promise((resolve,reject)=>{
console.log(`${url.info}开始调用`)
setTimeout(()=>{
console.log(`${url.info}调用结束`);
resolve()
},url.time)
})
}
limitLoad($urls,loadUrl,3)
code2
// 请求列表
const requestList = [
() =>
new Promise(resolve => {
console.log('star', 1);
setTimeout(() => {
console.log('done', 1);
resolve(1);
}, 1 * 1000);
}),
() =>
new Promise(resolve => {
console.log('star', 2);
setTimeout(() => {
console.log('done', 2);
resolve(2);
}, 3 * 1000);
}),() =>
new Promise(resolve => {
console.log('star', 3);
setTimeout(() => {
console.log('done', 3);
resolve(3);
}, 7 * 1000);
}),() =>
new Promise(resolve => {
console.log('star', 4);
setTimeout(() => {
console.log('done', 4);
resolve(4);
}, 0 * 1000);
}),() =>
new Promise(resolve => {
console.log('star', 5);
setTimeout(() => {
console.log('done', 5);
resolve(5);
}, 3 * 1000);
}),() =>
new Promise(resolve => {
console.log('star', 6);
setTimeout(() => {
console.log('done', 6);
resolve(6);
}, 2 * 1000);
})
];
const parallelRun = (limit)=>{
let currRequest = 0;// 当前并行的请求
const main = ()=>{
if(currRequest<=limit && requestList.length){
currRequest++;
const memoR = requestList.shift()
memoR().finally(()=>{
currRequest--;
main()
})
}
}
for(let i =0;i<limit;i++){
main()
}
}
parallelRun(3)