JavaScript/TypeScript 实现并发请求控制的示例代码

首先,实现并发请求控制的核心是利用 Promise 和 async/await 特性,统计当前请求并发数和控制请求的执行顺序。以下是一个 JavaScript 的示例代码:

const MAX_REQUESTS = 5 // 设置最大并发请求数量
let currentRequest = 0 // 当前请求并发数计数器

// 请求响应函数,返回 Promise
const request = (url) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(`Response from ${url}`)
    }, 1000)
  })
}

// 并发控制函数,返回 Promise
const limitConcurrency = async (urls) => {
  const results = []
  for (let i = 0; i < urls.length; i++) {
    if (currentRequest >= MAX_REQUESTS) {
      await new Promise((resolve) => {
        const interval = setInterval(() => {
          if (currentRequest < MAX_REQUESTS) {
            clearInterval(interval)
            resolve()
          }
        }, 1000)
      })
    }
    currentRequest++
    const result = await request(urls[i])
    results.push(result)
    currentRequest--
  }
  return results
}

// 示例函数,调用并发控制函数展示效果
const main = async () => {
  const urls = ['url1', 'url2', 'url3', 'url4', 'url5', 'url6', 'url7', 'url8', 'url9', 'url10']
  const results = await limitConcurrency(urls)
  console.log(results)
}

main() // 执行示例函数

以上代码中,定义了一个最大并发请求数量 MAX_REQUESTS,和一个当前请求并发数计数器 currentRequestrequest 函数模拟了一次请求,返回 Promise 类型的 response。limitConcurrency 函数控制并发数和请求顺序,对每个请求的执行结果进行收集,最终返回 Promise 类型的结果数组 resultsmain 函数仅作为示例调用 limitConcurrency 函数,控制同时发出 10 个请求,观察并发控制结果。

第二个示例代码是 TypeScript 实现版本,基本逻辑与 JavaScript 版本相同,但增加了类型注解和一些简化操作:

const MAX_REQUESTS = 5 // 设置最大并发请求数量
let currentRequest = 0 // 当前请求并发数计数器

// 请求响应函数,返回 Promise
const request = (url: string): Promise<string> =>
  new Promise((resolve) =>
    setTimeout(() => resolve(`Response from ${url}`), 1000)
  )

// 并发控制函数,返回 Promise
const limitConcurrency = async (urls: string[]): Promise<string[]> => {
  const results: string[] = []
  for (const url of urls) {
    if (currentRequest >= MAX_REQUESTS) {
      await new Promise((resolve) => {
        const interval = setInterval(() => {
          if (currentRequest < MAX_REQUESTS) {
            clearInterval(interval)
            resolve(null)
          }
        }, 1000)
      })
    }
    currentRequest++
    results.push(await request(url))
    currentRequest--
  }
  return results
}

// 示例函数,调用并发控制函数展示效果
const main = async () => {
  const urls = [
    'url1',
    'url2',
    'url3',
    'url4',
    'url5',
    'url6',
    'url7',
    'url8',
    'url9',
    'url10',
  ]
  const results = await limitConcurrency(urls)
  console.log(results)
}

main() // 执行示例函数

以上代码中,增加了函数和形参类型注解,并使用了 for...of 语法替换了常规的 for 循环语句。这是因为 TypeScript 具备更强的类型检查功能,可以自动识别数组的项类型。这样可以避免一些类型错误和转换操作,让代码更简洁易懂。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript/TypeScript 实现并发请求控制的示例代码 - Python技术站

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

相关文章

  • Java并发编程之常用的多线程实现方式分析

    Java并发编程之常用的多线程实现方式分析 介绍 Java作为一门历史悠久的编程语言,其并发编程支持非常完善。在实际的开发过程中,多线程技术经常用于提高程序的性能和处理能力。本文将对Java中多线程常用的几种实现方式进行分析,并给出两个示例介绍。 多线程实现方式 继承Thread类 继承Thread类是Java中非常基本的多线程实现方式之一。具体步骤如下: …

    多线程 2023年5月16日
    00
  • Java 多线程之两步掌握

    Java 多线程是 Java 常用的编程技巧之一,可以有效提高程序的并发性能。本文将介绍 Java 多线程的两步掌握,通过两个示例说明,让大家更好理解和掌握。 步骤一:创建线程 Java 多线程的核心是线程的创建。Java 中有两种方式创建线程:继承 Thread 类和实现 Runnable 接口。具体示例如下: 继承 Thread 类 public cla…

    多线程 2023年5月17日
    00
  • C语言通过案例讲解并发编程模型

    C语言通过案例讲解并发编程模型 什么是并发编程模型? 并发编程模型是指一种应用程序设计的方法,通过该方法,应用程序可以让多个任务并行执行。在并发编程中,任务并不是按顺序依次执行的,而是在同时执行。并发编程旨在提高应用程序的效率,使其可以更快地执行任务。 为什么需要并发编程模型? 现代计算机硬件通常都有多核处理器,这意味着计算机可以同时执行多个任务。如果我们的…

    多线程 2023年5月17日
    00
  • python单线程下实现多个socket并发过程详解

    本文将为大家详细讲解如何在 Python 单线程下实现多个 socket 并发,具体内容如下: 1. 什么是 socket socket 是计算机上的一个抽象概念,就像打电话需要电话机一样,在网络中发送信息需要由 socket 传递和接收。在 Python 编程语言中,socket 是标准库中用于实现网络通信的一种方式。 2. 单线程下实现多个 socket…

    多线程 2023年5月17日
    00
  • Linux系统下Shell多线程编程的实例

    我来为您详细讲解一下在Linux系统下Shell多线程编程的实例攻略。 Shell多线程编程的实例攻略 1. Shell脚本实现多线程 在linux系统下,我们可以通过工具和bash本身的内置命令实现多线程编程。其中常用的工具包括:GNU Parallel和xargs命令。 使用GNU Parallel实现多线程: cat filelist | parall…

    多线程 2023年5月17日
    00
  • 【java 多线程】守护线程与非守护线程的详解

    Java多线程:守护线程与非守护线程的详解 什么是守护线程? 在Java多线程中,守护线程是一种在后台运行的线程,它不会阻止程序的结束,也不会执行任何没有被其他非守护线程阻止的操作。 换句话说,当程序中最后一个非守护线程结束时,JVM会强制退出来,即使守护线程还在运行。 如何创建守护线程? 可以通过Thread类的setDaemon()方法来创建守护线程,示…

    多线程 2023年5月17日
    00
  • 如何利用Redis分布式锁实现控制并发操作

    下面将为您详细讲解如何利用Redis分布式锁实现控制并发操作的完整攻略。 什么是分布式锁 分布式锁是用来保证在分布式环境下,同一个资源(例如数据库、文件等)在同一时刻只能被一个进程访问,以避免数据不一致或数据被多次处理的问题。常用的分布式锁的实现方式有 ZooKeeper、Redis等。 Redis分布式锁实现原理 Redis分布式锁的实现原理可分为两步:1…

    多线程 2023年5月16日
    00
  • MySQL 数据库如何解决高并发问题

    MySQL 数据库在高并发场景下有多种解决方法,下面我将介绍其中的一些方法。 1. 优化 SQL 语句 首先,要优化 SQL 语句以提高查询速度和降低系统的负载。 1.1 索引 索引是提高查询速度的关键。在创建表时,需要考虑哪些字段需要作为索引来优化查询。不过,索引的过多也会影响写入性能,因此需要根据实际情况来选择适当的索引。 1.2 避免使用 SELECT…

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