首页 > 其他分享 >请求合并(后端服务可能扛不住频繁的请求时,将多个重复请求(参数不一样),合并成一个,也就是将参数合并)

请求合并(后端服务可能扛不住频繁的请求时,将多个重复请求(参数不一样),合并成一个,也就是将参数合并)

时间:2023-09-20 09:05:05浏览次数:42  
标签:const 函数 批量 合并 参数 请求

const fetchUserInfoBatched = createBatchedRequest<string, UserBaseInfo>(
  async (userIds) => {
    const { data } = await request.post('/api/user/list', {
      userIds,
    });
    return data;
  },
  500 // 设置延迟时间为500毫秒
);

// 使用示例
async function getUserInfo() {
  const user1 = await fetchUserInfoBatched(1);
  const user2 = await fetchUserInfoBatched(2);
  const user3 = await fetchUserInfoBatched(3);

  console.log(user1, user2, user3);
}

getUserInfo();

createBatchedRequest

interface BatchRequestItem<T, R> {
  params: T;
  resolve: (r: R) => void;
  reject: (reason: unknown) => void;
}

/**
 * 创建批量请求的函数
 * 在一定延迟时间内的所有请求都会被合并提交并批量发送
 * @param batchFunction 合并后的请求函数
 * @param delay 延迟时间,以毫秒为单位
 */
export function createBatchedRequest<T, R>(
  batchFunction: (batchParams: T[]) => Promise<R[]>,
  delay = 200
): (params: T) => Promise<R> {
  const batchQueue: BatchRequestItem<T, R>[] = [];
  let isBatching = false;
  let timer: NodeJS.Timeout | null = null;

  async function executeBatchedRequest() {
    if (isBatching) return;
    isBatching = true;

    const itemsToBatch = [...batchQueue];
    batchQueue.length = 0;

    try {
      const batchedResult = await batchFunction(itemsToBatch.map((item) => item.params));
      itemsToBatch.forEach((item, index) => {
        item.resolve(batchedResult[index]);
      });
    } catch (error) {
      itemsToBatch.forEach((item) => {
        item.reject(error);
      });
    } finally {
      isBatching = false;
    }
  }

  return (params: T): Promise<R> => {
    return new Promise<R>((resolve, reject) => {
      batchQueue.push({
        params,
        resolve,
        reject,
      });

      // Execute the batched request after the specified delay
      if (!timer) {
        timer = setTimeout(() => {
          executeBatchedRequest();
          timer = null;
        }, delay);
      }
    });
  };
}
  • 批量请求管理: createBatchedRequest 函数用于管理批量请求,它可以将多个独立的请求合并成一个批量请求,以减少不必要的网络请求次数。

  • 参数说明:

    • batchFunction 参数是一个函数,接受一个数组 batchParams 作为参数,返回一个 Promise,用于处理合并后的请求并返回结果。
    • delay 参数表示延迟时间,以毫秒为单位。在指定的延迟时间内,所有的请求会被收集起来,然后一次性发送给 batchFunction 处理。
  • 请求队列: 函数内部维护一个请求队列 batchQueue,用于存储待合并的请求项。每个请求项包含了请求的参数、成功回调函数 resolve 和失败回调函数 reject

  • 执行批量请求:

    • 当有请求调用返回的函数时,它会将请求参数和相应的回调函数添加到请求队列 batchQueue 中。
    • 使用定时器控制,在指定的延迟时间后,会执行 executeBatchedRequest 函数。
    • executeBatchedRequest 函数会检查是否已经有批量请求正在处理(isBatching 标志),如果有,则不进行处理,直到当前批量请求完成。
    • 如果没有正在处理的批量请求,它会取出请求队列中的所有请求项,合并参数后调用 batchFunction 处理请求。
    • 成功或失败后,会分别调用请求项中的 resolve 或 reject 回调函数,将结果返回给每个独立的请求。

标签:const,函数,批量,合并,参数,请求
From: https://www.cnblogs.com/privateLogs/p/17716394.html

相关文章

  • logback-spring配置文件一些参数的意义
    <?xmlversion="1.0"encoding="UTF-8"?><configuration><!--控制台打印日志的相关配置--><appendername="STDOUT"class="ch.qos.logback.core.ConsoleAppender"><!--日志格式--><encoder>......
  • SpringMVC - 1( 了解 + postman 工具 + 请求与响应 + Rest 风格 )
    SpringMVC目录SpringMVCSpringMVC概述SpringMVC入门案例案例制作工作流程解析启动服务器初始化过程单次请求过程bean加载控制问题分析思路分析环境准备bean加载控制PostMan工具的使用PostMan简介PostMan安装保存当前请求请求与响应设置请求映射路径环境准备问题分析设置映......
  • 23. 合并 K 个升序链表
    给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。 示例1:输入:lists=[[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[1->4->5,1->3->4,2->6]将它们合并到一个有序链表中得到。1->1->2->3->4->4-......
  • JS加密参数的解决办法
    基本上所有前端加密都是用的CryptoJS库,因此可以通过特征函数定位加密函数。比如CryptoJS要求加密时需要对key(密钥)进行解析(parse)后才能作为参数,因此所有需要加密的地方均会调用enc.Utf8.parse函数,比如​​即便是webpack打包的前端代码,这个函数名也不会被混淆为abcd之类的名字,所......
  • Vue源码学习(七):合并生命周期(混入Vue.Mixin)
    好家伙, 1.使用场景现在来,来想一下,作为一个使用Vue的开发者,假设现在我们要使用created(),我们会如何使用1.1. .vue文件中使用<template><div><h1>{{message}}</h1></div></template><script>exportdefault{created(){this.message='......
  • 参数校验问题
    所需依赖点击查看代码<!--校验注解实现--><!--https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator--><dependency><groupId>org.hibernate.validator</groupId><artifactI......
  • cookie json 请求头
    准备工作1.导入json依赖点击查看代码<!--jackson依赖--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.15.2</version......
  • 关于正则表达式 g,m 参数的总结,为了回答“正则表达式(/[^0-9]/g,'')中的"/g"是什么意
    为了解答“正则表达式(/[^0-9]/g,'')中的"/g"是什么意思?”这个问题,也为了能够便于大家对正则表达式有一个更为综合和深刻的认识,我将一些关键点和容易犯糊涂的地方再系统总结一下。 总结1:附件参数g的用法 表达式加上参数g之后,表明可以进行全局匹配,注意这里“可以”的含义。我们详......
  • angular event服务,不同组件间参数传递
    利用AngularEvent在不同组件之间传递数据为了实现在Angular不同Component之间相互传递数据,可以使用Event分发的思路来实现。使用事件实现在不同组件之前传递数据的思路如下:定义一个服务,用来实现事件的发布和订阅方法。组件A注入事件服务的依赖,将自己要传递数据的数据以事件的形式......
  • 【Android studio】【Gradle】dependencies配置参数细解及异常解决
    依赖项配置implementationGradle会将依赖项添加到编译类路径,并将依赖项打包到构建输出。不过,当您的模块配置implementation依赖项时,会让Gradle了解您不希望该模块在编译时将该依赖项泄露给其他模块。也就是说,其他模块只有在运行时才能使用该依赖项。使用此依赖项配置代替api......