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

yizhihongxing

首先,实现并发请求控制的核心是利用 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日

相关文章

  • Python多线程编程之threading模块详解

    Python多线程编程之threading模块详解 什么是多线程编程 多线程编程是指在一个程序进程中同时运行多个不同的线程,这些线程可能会共享程序的内存空间和其他资源。在多线程编程中,有时需要将某一些任务放在不同的线程中运行,从而带来以下好处: 使程序可以同时执行多个任务,提高程序效率; 能够更加充分地利用计算机的CPU和其他资源; 在某些情况下,使用多线程…

    多线程 2023年5月16日
    00
  • GO语言并发编程之互斥锁、读写锁详解

    GO语言并发编程之互斥锁、读写锁详解 什么是互斥锁和读写锁 在并发编程中,多个 goroutine(协程)同时访问某个共享资源,容易出现数据竞争的情况,导致程序出现意想不到的结果或全面崩溃。为了解决这个问题,Go 语言提供了互斥锁(Mutex)和读写锁(RWMutex)的机制。 互斥锁:是一个可以被锁定和解锁的标准计数信号量。在同一时刻,只能有一个 goro…

    多线程 2023年5月17日
    00
  • Redis处理高并发机制原理及实例解析

    Redis处理高并发机制原理及实例解析 简介 Redis是一种高性能的NoSQL存储,拥有高并发、高可用、高性能等特点。在现代web应用中,Redis已经成为了必不可少的组件之一。本文将详细介绍Redis处理高并发的机制原理,并结合实例进行说明。 Redis处理高并发的机制原理 Redis处理高并发的机制主要依靠以下两个方面: 基于单线程模型的高效执行 多种…

    多线程 2023年5月16日
    00
  • C++实现多线程查找文件实例

    下面是C++实现多线程查找文件的完整攻略: 目标 本文要实现一个多线程的文件查找程序,能够快速地在指定目录下查找指定后缀名的文件。 准备工作 首先,在使用多线程之前,需要了解一些基本的多线程知识。 多线程基础知识 线程的基本概念 ​ 线程是程序执行路径的最小单位,也就是程序执行时线程是调度的基本单位。一个进程中可以包含多个线程,线程共享进程的地址空间和系统资…

    多线程 2023年5月16日
    00
  • AQS同步组件Semaphore信号量案例剖析

    下面详细讲解“AQS同步组件Semaphore信号量案例剖析”的完整攻略。 什么是Semaphore信号量? Semaphore信号量是AQS同步组件的一种,它允许多线程在同一时刻访问某个资源,但是要限制同时访问的线程数量。Semaphore的作用就相当于一个门卫,只允许一定数量的人进入资源区域,其他人就需要等待。 Semaphore构造方法:Semapho…

    多线程 2023年5月17日
    00
  • Java系统的高并发解决方法详解

    下面是Java系统的高并发解决方法详解的完整攻略。 1. 引言 当前,Java 是一种流行的编程语言,并且在企业级软件和 Web 应用程序开发中被广泛使用。然而,高并发是现代互联网应用程序中面临的一个重要挑战,因此如何应对高并发已成为开发人员必须面对的重要问题。本文中,我们将探讨 Java 系统的高并发解决方法。 2. 高并发的影响因素 在开始介绍 Java…

    多线程 2023年5月16日
    00
  • 大数据量高并发的数据库优化详解

    大数据量高并发的数据库优化详解 为什么需要数据库优化? 随着业务的发展,数据库中存储的数据量和访问量会逐渐增大,随之带来的是数据库性能的下降和访问延迟的增加。为了提高业务系统的性能,必须对数据库进行优化。 数据库优化的方向 通常我们从以下几方面对数据库进行优化: SQL 优化 索引优化 数据库服务器配置优化 读写分离和分库分表等方式 SQL 优化 SQL 优…

    多线程 2023年5月17日
    00
  • 详解go语言中并发安全和锁问题

    详解Go语言中并发安全和锁问题 概述 Go语言并发编程是其强项之一,也是相对其他语言有更高效的并发执行效果的原因之一。但是,由于并发编程的特殊性质,往往会产生多线程竞争等并发安全问题,因此需要使用锁来解决这些问题。 并发安全性 并发安全是指对于多线程访问的资源,经过设计和实现后可以在多线程访问的情况下,保证资源的正确性和一致性。在Go语言中,通过使用锁机制来…

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