限制异步操作的并发个数并尽可能快的完成全部

# 限制异步操作的并发个数并尽可能快的完成全部

  1. 有8个图片资源的url,已经存储在数组urls中。urls类似于['https://image1.png', 'https://image2.png', ....]
  2. 而且已经有一个函数function loadImg,输入一个url链接,返回一个Promise,该Promise在图片下载完成的时候resolve,下载失败则reject。
  3. 但有一个要求,任何时刻同时下载的链接数量不可以超过3个。
  4. 请写一段代码实现这个需求,要求尽可能快速地将所有图片下载完成。
var urls = [
  "https://hexo-blog-1256114407.cos.ap-shenzhen-fsi.myqcloud.com/AboutMe-painting1.png",
  "https://hexo-blog-1256114407.cos.ap-shenzhen-fsi.myqcloud.com/AboutMe-painting2.png",
  "https://hexo-blog-1256114407.cos.ap-shenzhen-fsi.myqcloud.com/AboutMe-painting3.png",
  "https://hexo-blog-1256114407.cos.ap-shenzhen-fsi.myqcloud.com/AboutMe-painting4.png",
  "https://hexo-blog-1256114407.cos.ap-shenzhen-fsi.myqcloud.com/AboutMe-painting5.png",
  "https://hexo-blog-1256114407.cos.ap-shenzhen-fsi.myqcloud.com/bpmn6.png",
  "https://hexo-blog-1256114407.cos.ap-shenzhen-fsi.myqcloud.com/bpmn7.png",
  "https://hexo-blog-1256114407.cos.ap-shenzhen-fsi.myqcloud.com/bpmn8.png",
];
function loadImg(url) {
  return new Promise((resolve, reject) => {
    const img = new Image();
    img.onload = function() {
      console.log("一张图片加载完成");
      resolve(img);
    };
    img.onerror = function() {
    	reject(new Error('Could not load image at' + url));
    };
    img.src = url;
  });

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function limitLoad(urls, loadImg) {
 const sources = [...urls]
 let count = 0
 async function start() {
  if (sources.length > 0) {
   if (count <= 3) {
    count url = sources.shift()
    count++
    await loadImg(url).then(() => {
     count--
     start()
    })
    .catch((err) => console.log(err))
   }
   start()
  }
 }
 return start()
}

limitLoad(urls, loadImg)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
上次更新: 2022/7/29 上午11:39:16