Promise并发控制,简单易懂

114 阅读1分钟

直接干货

实现一个并发请求函数concurrencyRequest(urls, maxNum),要求如下:

  • 要求最大并发数 maxNum
  • 每当有一个请求返回,就留下一个空位,可以增加新的请求
  • 所有请求完成后,结果按照 urls 里面的顺序依次打出(发送请求的函数可以直接使用fetch即可)

效果如下:

并发动画.gif

代码如下:

function concurrencyRequest(urls, maxNum) {
  function fn() {
    // 取较小值,即当前最大可并发数量
    let max = Math.min(urls.length, maxNum);
    for (let i = 0; i < max; i++) {
      let url = urls.shift();
      maxNum--;
      fetch(url).finally(() => {
        console.log(url)
        maxNum++;
        // 利用异步,执行回调时,maxNum++并递归
        fn();
      });
    }
  }
  fn();
}

通过下方代码测试,效果见上图:

const urls = [];
for (let i = 1; i <= 20; i++) {
  urls.push(`https://jsonplaceholder.typicode.com/todos/${i}`);
}
concurrencyRequest(urls, 3)

Tip:思路

每当有请求完成时,就需要重新去发请求。需要不断的去重新发送请求,思考这里,明显可以通过递归完成。

1、递归结束条件:请求发送完,即urls长度为0

2、递归参数:不需要,通过改变数组来完成

3、递归返回值:不需要,目的是发送请求

4、每次递归需要做什么:通过改变maxNum,来明确该次递归需要发送几次请求。

小彩蛋

执行结果并不是顺序返回的哦

并发console动画.gif

觉得有用的小伙伴们给个赞吧!