1. function asyncPool(limit, array, iteratorFn) {
    2. let executing = [] // 正在执行的
    3. let res = [] // 所有结果
    4. let index = 0 // 当前索引
    5. let len = array.length // 整体长度
    6. function enqueue () { //队列函数
    7. if (index === len) return Promise.resolve()
    8. let item = array[index++]
    9. let e = Promise.resolve().then(() => iteratorFn(item))
    10. res.push(e)
    11. let p = e.then(() => {
    12. executing.splice(executing.indexOf(e), 1)
    13. })
    14. executing.push(p)
    15. let r = Promise.resolve()
    16. if (executing.length >= limit) {
    17. r = Promise.race(executing)
    18. }
    19. return r.then(() => enqueue())
    20. }
    21. return enqueue().then(() => Promise.all(res)) // 触发队列执行,并且确保队列执行完之后监控all res
    22. }
    23. const timeout = i => new Promise(resolve => setTimeout(() => {
    24. return resolve(i)
    25. }, i));
    26. asyncPool(2, [1000, 5000, 3000, 2000], timeout).then(results => {
    27. console.log(results)
    28. });