// 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);
})