// promiselist limit
const demo = [
1, 5, 3, 4, 1
].map(n => {
return () => new Promise((r) => {
setTimeout(() => r(n), n * 1000)
})
})
const fn = (list: (() => Promise<any>)[], limit: number) => {
return new Promise((resolve, reject) => {
const result: any = []
const loop: any = []
// @ts-ignore
const run = (getPromise, index) => {
const resultLength = result.filter((v:any) => v!== undefined).length
const isRunning = index - resultLength
const isWaiting = isRunning >= limit
console.log({
index , isRunning, isWaiting
});
if (isWaiting) {
loop.push(() => run(getPromise, index))
return
} else {
getPromise().then((res: any) => {
result[index] = res
if (result.filter((v:any) => v!== undefined).length < list.length) {
if (loop.length) {
loop.shift()()
} else {
// 执行最后一个任务中
console.log('执行最后一个任务中');
return
}
} else {
resolve(result)
}
})
}
}
list.forEach((getPromise, index) => {
run(getPromise, index)
})
})
}
fn(demo, 3).then(res => {
console.log(res);
})