并发控制Promise,但是时间却相同,求解答?

我自己写了一个控制最大并发数的promise,但是不知道为什么不管我是并发1个还是并发10个,最后执行的时间都一样,我觉得逻辑上没有问题,就是在promise完成后调用.then()方法然后开启下一个调用,目前找不出问题到底出在哪,有无大佬帮忙指出一下,感谢!

var createPromises = function (n) {
    return new Array(n).fill().map((_, index) => {
        return new Promise((res, rej) => {
            setTimeout(() => {
                res(`第${index + 1}个完成`)
            }, Math.floor(Math.random() * n))
        })
    })
}
var conPromise = function (promises, n) {
    let sumLen = promises.length
    return new Promise((res, rej) => {
        let retArr = [], retCount = 0
        for (let c = 0; c < n; c++) {
            goNext(retArr, c)
        }

        async function goNext(retArr, index) {
            if (promises.length === 0) {
                if (retCount === sumLen) {
                    res(retArr);
                }
                return;
            }
            promises.shift().then((val) => {
                retCount++
                retArr[index] = val
                let nextIndex = sumLen - promises.length
                goNext(retArr, nextIndex)
            }).catch(err => {
                rej(err)
            })
        }
    })
}


conPromise(createPromises(100), 10).then((retArr) => {
    console.log('并发返回结果👇');
    retArr.forEach(r => {
        console.log(r);
    });
});

这是并发1个的
image.png

这是并发10个的
image.png

阅读 1.5k
3 个回答
✓ 已被采纳
@@ -1,9 +1,9 @@
 var createPromises = function (n) {
   return new Array(n).fill().map((_, index) => {
-      return new Promise((res, rej) => {
+      return () => new Promise((res, rej) => {
           setTimeout(() => {
               res(`第${index + 1}个完成`)
-          }, Math.floor(Math.random() * n))
+          }, 100)
       })
   })
 }
@@ -22,7 +22,7 @@ var conPromise = function (promises, n) {
               }
               return;
           }
-          promises.shift().then((val) => {
+          promises.shift()().then((val) => {
               retCount++
               retArr[index] = val
               let nextIndex = sumLen - promises.length
新手上路,请多包涵

将 setTimeout 的延迟时间设置为一个固定的值,比如100毫秒,不要用随机数

试下这个

var conPromise = function (promises, n) {
    let sumLen = promises.length;
    let inProgress = 0;
    let retArr = new Array(sumLen).fill(null);
    let currentIndex = 0;

    return new Promise((res, rej) => {
        function processNext() {
            if (currentIndex === sumLen) {
                if (inProgress === 0) {
                    res(retArr);
                }
                return;
            }
            while (inProgress < n && currentIndex < sumLen) {
                let index = currentIndex++;
                inProgress++;
                promises[index].then((val) => {
                    retArr[index] = val;
                }).catch(rej).finally(() => {
                    inProgress--;
                    processNext();
                });
            }
        }
        processNext();
    });
};
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏