时刻保持某个数量的并发下载请求

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>test</title>
  </head>
  <body>
    <script>
      function downloadImage(url) {
        // const img = new Image();
        return new Promise((resolve) => {
          // console.log(`开始下载: ${url}`);
          const time = Math.random() * 3000; // 随机模拟下载时间
          // 模拟图片下载
          setTimeout(() => {
            console.log(`下载完成: ${url}`);
            resolve(`图片数据: ${url}`);
          }, time);
        });
        // img.onload = () => {
        //   console.log(`下载完成: ${url}`);
        //   resolve(`图片数据: ${url}`);
        // };

        // img.onerror = () => {
        //   // 记录错误
        //   errors[index] = new Error(`Failed to load image: ${url}`);
        //   resolve(); // 即使失败也 resolve,保证流程继续
        // };

        // img.src = url;
      }

      // 并发控制函数
      async function downloadWithConcurrency(imageUrls, maxConcurrency = 3) {
        // 下载完成结果
        const results = [];
        // 正在执行下载的请求
        const executing = new Set();

        for (const url of imageUrls) {
          // 如果达到最大并发数,等待其中一个完成
          if (executing.size >= maxConcurrency) {
            await Promise.race(executing);
          }

          const promise = downloadImage(url).then((result) => {
            results.push(result);
            executing.delete(promise);
          });

          executing.add(promise);
        }

        // 等待所有剩余任务完成
        await Promise.all(executing);
        return results;
      }

      // 测试
      const imageUrls = [
        "image1.jpg",
        "image2.jpg",
        "image3.jpg",
        "image4.jpg",
        "image5.jpg",
        "image6.jpg",
        "image7.jpg",
        "image8.jpg",
      ];

      downloadWithConcurrency(imageUrls)
        .then((results) => {
          console.log("所有图片下载完成:", results);
        })
        .catch((error) => {
          console.error("下载出错:", error);
        });
    </script>
  </body>
</html>


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • """1.个性化消息: 将用户的姓名存到一个变量中,并向该用户显示一条消息。显示的消息应非常简单,如“Hello ...
    她即我命阅读 8,624评论 0 5
  • 为了让我有一个更快速、更精彩、更辉煌的成长,我将开始这段刻骨铭心的自我蜕变之旅!从今天开始,我将每天坚持阅...
    李薇帆阅读 6,091评论 0 3
  • 似乎最近一直都在路上,每次出来走的时候感受都会很不一样。 1、感恩一直遇到好心人,很幸运。在路上总是...
    时间里的花Lily阅读 5,278评论 0 2
  • 1、expected an indented block 冒号后面是要写上一定的内容的(新手容易遗忘这一点); 缩...
    庵下桃花仙阅读 3,627评论 0 1
  • 一、工具箱(多种工具共用一个快捷键的可同时按【Shift】加此快捷键选取)矩形、椭圆选框工具 【M】移动工具 【V...
    墨雅丫阅读 3,590评论 0 0