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多线程的具体介绍与使用笔记小结

    Java多线程的具体介绍与使用 什么是多线程 多线程指的是在同一时间内,CPU运行多个线程来完成不同的任务。在Java中,每个线程都是独立的执行路径,使得程序可以分配更多的资源去处理其他任务,并确保线程之间的相互独立。 多线程的优点 多线程的优点主要体现在以下几个方面: 实现并发编程,提升代码的效率和性能; 减少线程资源的竞争,提高程序的响应性和稳定性; 分…

    多线程 2023年5月17日
    00
  • redis查看连接数及php模拟并发创建redis连接的方法

    以下是详细讲解“redis查看连接数及php模拟并发创建redis连接的方法”的完整攻略。 查看redis连接数 要查看redis连接数,需要使用redis客户端的client list命令,该命令可以列出当前redis服务器中所有的客户端连接信息,包括客户端IP、端口号、连接状态等,然后我们可以通过对连接数的计数来统计连接数。 具体实现步骤如下: 打开re…

    多线程 2023年5月17日
    00
  • Java并发中的ABA问题学习与解决方案

    Java并发中的ABA问题学习与解决方案 什么是ABA问题? 在 Java 并发编程中,多个线程同时访问同一个共享变量时,由于线程调度不确定性,可能导致读写出现交叉,进而出现意料之外的问题。其中比较典型的就是 ABA 问题。 ABA 问题的简介来说,就是:线程1将共享变量A的值由原来的值A1修改为A2,然后又将A2修改为A1;这时线程2也来操作变量A,判断变…

    多线程 2023年5月17日
    00
  • 分析详解python多线程与多进程区别

    分析详解Python多线程与多进程区别 在Python中多线程和多进程是用来实现并发编程的两种不同的机制。在开始学习这两种技术之前,我们必须了解它们的异同之处,以便我们能够采用最合适的技术来解决具体问题。 什么是多线程? 多线程是将一个进程内部的任务分为不同的线程来进行同时执行的机制。每个线程都有自己的代码,自己的栈以及自己的寄存器,但是它们之间共享进程的内…

    多线程 2023年5月16日
    00
  • Java 多线程并发编程_动力节点Java学院整理

    Java 多线程并发编程攻略 Java 多线程并发编程是 Java 开发中必不可少的技能,能够充分利用多核 CPU 在同一时间处理多个任务,提高程序的并发性和效率。本文将为大家介绍 Java 多线程并发编程的攻略,包括线程的创建、同步、互斥、线程池等知识点。 线程的创建 Java 中创建线程有两种方式,一种是继承 Thread 类,另一种是实现 Runnab…

    多线程 2023年5月16日
    00
  • 使用JAVA实现高并发无锁数据库操作步骤分享

    使用JAVA实现高并发无锁数据库操作可以通过以下步骤进行: 1. 选择适合的数据库 选择适合高并发的无锁数据库,如Apache Cassandra或MongoDB等。 2. 设计数据结构 通过设计合适的数据结构来支持高并发无锁操作。在Cassandra中,使用列族和列名来存储数据,这些名称可以确定唯一的行。每个行可以包含多个列族,每个列族下可能包含多个列。在…

    多线程 2023年5月17日
    00
  • PHP+Redis事务解决高并发下商品超卖问题(推荐)

    PHP+Redis事务解决高并发下商品超卖问题(推荐) 问题背景 在高并发下,如果不做任何处理,会出现商品超卖的问题。例如,用户同时购买同一个商品,但是只有一件商品的库存,如果没有控制,就会导致超卖现象。 解决方案 为了解决这个问题,我们可以利用Redis事务来实现。Redis事务提供了原子性,即事务中的操作要么全部成功,要么全部失败。因此,我们可以通过Re…

    多线程 2023年5月17日
    00
  • Java多线程ThreadPoolExecutor详解

    Java多线程ThreadPoolExecutor详解 ThreadPoolExecutor 是 Java 中常用的线程池实现类,通过线程池可以更好地使用资源,提高程序性能。本文将详细讲解 ThreadPoolExecutor 的使用,包括线程池的创建、使用和销毁等方面。 线程池的创建 线程池是通过 ThreadPoolExecutor 类创建的,构造方法有…

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