JavaScript如何利用Promise控制并发请求个数

如果我们需要在JavaScript中同时发起多个异步请求,我们可以通过使用Promise.all来实现并发处理。但是,如果我们的请求数量非常庞大,我们可能需要控制并发请求数量,以避免对系统造成过度的压力。下面是一些如何使用Promise来控制并发请求个数的技巧。

控制并发请求个数的方法

  1. 限制最大并发数

我们可以使用一个计数器和一个for或者while循环来实现。首先,我们定义一个可控并发数量max的变量,然后只有当并发请求数量小于max时才发起异步请求。

const urls = [url1, url2, url3, url4, url5];
const max = 3 // 控制最大并发数

async function handleRequests() {
  let current = 0;
  while (current < urls.length) {
    if (current < max) {
      fetch(urls[current++])
        .then(response => response.json())
        .then(data => console.log(data))
        .catch(error => console.error(error));
    } else {
      await new Promise(resolve => setTimeout(resolve, 1000)); // 1秒后再次检查
    }
  }
}

handleRequests();
  1. 利用递归实现

我们可以使用递归调用函数来控制并发量。在处理每个请求时,我们使用Promise.resolve对其进行封装,然后使用await等待其完成,当达到最大并发数时,我们使用等待Promise链中最前面的Promise解决,然后通过递归调用函数继续发送请求。

const urls = [url1, url2, url3, url4, url5];
const max = 3 // 控制最大并发数

function handleRequests(urls) {
  return new Promise((resolve, reject) => {
    const result = [];
    let count = 0;
    const next = () => {
      if (count >= urls.length) {
        resolve(result)
      }
      if (count < urls.length) {
        const currentUrl = urls[count++];
        const currentPromise = fetch(currentUrl)
          .then(response => response.json())
          .then(data => {
            result.push(data);
            return data;
          })
          .catch(e => {
            reject(e);
          })
        Promise.resolve(currentPromise).then(next).catch(e => {
          reject(e);
        });
      }
    }
    for (let i = 0; i < max; i++) {
      next();
    }
  })
}

handleRequests(urls).then(data => console.log(data)).catch(error => console.error(error))

两条实例说明

  1. 并发请求API数据

我们有一组URL,我们需要在JavaScript中以控制并发数的方式访问它们。我们可以使用Promise来控制并发,如以下示例:

const urls = [
  'https://jsonplaceholder.typicode.com/todos',
  'https://jsonplaceholder.typicode.com/posts',
  'https://jsonplaceholder.typicode.com/users',
  'https://jsonplaceholder.typicode.com/comments'
];

async function handleRequests() {
  const max = 2; // 控制最大并发数
  const results = [];
  let current = 0;
  while (current < urls.length) {
    if (current < max) {
      const response = await fetch(urls[current++]);
      const data = await response.json();
      results.push(data);
    } else {
      await new Promise(resolve => setTimeout(resolve, 1000)); // 1秒后再次检查
    }
  }
  console.log(results);
}

handleRequests();
  1. 并发请求图片资源

我们有一组图片URL,我们需要在JavaScript中以控制并发数的方式加载它们。与前面的示例类似,我们可以使用Promise来控制并发。

const imgUrls = [
  'https://picsum.photos/200',
  'https://picsum.photos/300',
  'https://picsum.photos/400',
  'https://picsum.photos/500',
  'https://picsum.photos/600'
];

const loadImage = url =>
  new Promise((resolve, reject) => {
    const img = new Image();
    img.onload = () => {
      resolve(img);
    };
    img.onerror = () => {
      reject(new Error(`Unable to load image ${url}`));
    };
    img.src = url;
  });

async function loadImages() {
  const max = 3; // 控制最大并发数
  const result = [];
  let current = 0;
  while (current < imgUrls.length) {
    if (current < max) {
      const img = await loadImage(imgUrls[current++]);
      result.push(img);
    } else {
      await new Promise(resolve => setTimeout(resolve, 1000)); // 1秒后再次检查
    }
  }
  console.log(result);
}

loadImages();

以上两个示例都使用Promise方式控制并发数量实现。第一个示例在控制API请求的数量,第二个示例在控制图片请求的数量。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript如何利用Promise控制并发请求个数 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • 关于Java 并发的 CAS

    CAS(Compare and Swap)是一种并发机制,用于实现原子性操作。在并发编程中,当多个线程同时对共享变量进行操作时,会产生竞争条件(Race Condition),导致数据的不一致性、丢失、覆盖等问题。CAS机制通过比较期望值与实际值的方式,来确保正确性与一致性。 CAS的原理 CAS操作包括三个操作数:内存位置(V)、预期原值(A)和新值(B)…

    多线程 2023年5月17日
    00
  • 一文读懂吞吐量(TPS)、QPS、并发数、响应时间(RT)概念

    一文读懂吞吐量(TPS)、QPS、并发数、响应时间(RT) 什么是吞吐量(TPS)? 吞吐量(TPS),是指在单位时间内系统处理的事务数。其中的“事务”可以是任何系统操作,如HTTP请求、数据库查询等等。吞吐量是评价系统性能的一个重要指标,通常用来衡量同时处理多少用户请求的能力。 举例说明,如果在1秒钟内系统处理了100个事务,则吞吐量为100 TPS。 什…

    多线程 2023年5月16日
    00
  • C# 多线程中经常访问同一资源可能造成哪些问题

    C# 多线程中经常访问同一资源可能造成以下问题: 竞态条件 死锁 竞态条件 当多个线程在访问同一资源时,它们可能会相互干扰,以致结果无法确定或不正确。这种情况称为“竞态条件”,很难被预先检测,常见的情况包括: 多个线程尝试同时读取和修改同一个变量 多个线程尝试同时写入同一个文件 多个线程尝试同时访问同一个网络连接 例如,考虑一个账户余额查询和转账应用。我们在…

    多线程 2023年5月16日
    00
  • php多线程实现方法及用法实例详解

    PHP多线程实现方法及用法实例详解 什么是多线程? 多线程是指一个进程中包含多个执行路径,每个执行路径又称为线程。多线程程序具有多个并发执行的控制流,能提高程序的并行度,从而提高程序的运行效率。 为什么要使用多线程? 使用多线程可以提高程序的并行度,从而提高程序的运行效率。同时,多线程还可以让程序在执行IO等耗时操作时,不会被这些操作所阻塞,提高程序的响应速…

    多线程 2023年5月17日
    00
  • 详解php处理大并发大流量大存储

    详解PHP处理大并发大流量大存储的完整攻略 处理大并发、大流量、大存储是现代Web开发的重要挑战之一。在这篇文章中,我将详细讲解如何使用PHP来应对这一挑战。以下是本文的大体内容: 优化数据库访问 使用缓存技术 分布式存储 消息队列技术 集成CDN 1. 优化数据库访问 数据库是现代人们经常用于存储数据的工具,但它也是网站性能问题的来源之一。在PHP代码中,…

    多线程 2023年5月16日
    00
  • 详解java解决分布式环境中高并发环境下数据插入重复问题

    详解 Java 解决分布式环境中高并发环境下数据插入重复问题 背景 在高并发环境下,数据插入操作很容易出现重复插入的问题。例如,多个用户同时提交一个相同的表单,系统可能会将同样的数据插入数据库中多次,造成数据不一致的问题。这种情况在分布式环境下尤其常见,因为不同节点的时间戳可能不一致。 解决方案 方法一:利用 Unique 约束 在数据库中设置 Unique…

    多线程 2023年5月16日
    00
  • PHP解决高并发问题(opcache)

    PHP是一个常用的服务器端编程语言,但是在高并发的情况下,其效率和性能会受到影响,给服务器带来很大的压力。如何提高PHP的性能,解决高并发问题?这就需要使用到PHP的OPcache。 OPcache是PHP的内置模块,其作用是将PHP的源代码编译成opcode,以减少解释器解析PHP代码的时间,从而提高PHP的性能。OPcache将opcode存储在内存中,…

    多线程 2023年5月16日
    00
  • java并发之synchronized

    Java 并发之 synchronized 在 Java 中,我们可以使用 synchronized 来保证多线程程序的线程安全。本文将介绍 synchronized 的使用方式和注意事项。 synchronized 使用方式 synchronized 有三种使用方式: 1. 修饰实例方法 public synchronized void method() …

    多线程 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部