多次发请求优化为发一次请求
优化 getUserInfo 请求
要求
getUserInfo 是个通用接口,在各个模块里面都有可能使用 requestUserInfo 模拟的是请求服务端真正获取用户信息的方法
业务背景
- 在一个页面有 A, B, C 等多个功能模块,A, B, C 模块渲染执行顺序不可控
- 每个模块都会调用 getUserInfo 这个方法, 这个方法是可以直接调用 requestUserInfo 获取用户信息
- 调用三次就会发起三次网络请求
- 现在需要优化 getUserInfo 这个方法, 保证 getUserInfo 方法3次调用后, 最终只会发出一次网络请求。
测试用例
import { isEqual } from 'lodash-es';/*** 第二题*/// 核心用户请求
let _requestTime = 0;
const requestUserInfo = () => {// 这个方法的实现不能修改return Promise.resolve().then(() => {return new Promise<void>((resolve) => {setTimeout(() => {// 模拟 ajax 异步,1s 返回resolve();}, 1000);}).then(() => {_requestTime++;return {nick: "nick",age: "18",};});});
};async () => {try {// 模拟请求const result = await Promise.all([getUserInfo(),new Promise(resolve => setTimeout(async () => { resolve(await getUserInfo()) }, 300)),new Promise(resolve => setTimeout(async () => { resolve(await getUserInfo()) }, 2300))]);if (!isEqual(result, [{nick: "nick",age: "18",}, {nick: "nick",age: "18",}, {nick: "nick",age: "18",}])) {throw new Error('Wrong answer');}return _requestTime === 1;} catch (err) {console.warn('测试运行失败');console.error(err);return false;}
};
思路
- 由于测试用例使用Promise.all调用,则需要返回Promise。
- 又因为只需要调用一次接口则拿到数据之后需要缓存方便共享。
- 一旦有数据那就直接resolve。
- 由于Promise返回的也是Promise,可以缓存第一次的Promise,如果存在则只需要等第一次结束
- 结束之后的Promise我们再通过拿到结果进行resolve。
实现
let cache = null;
let preRequest = null;
const getUserInfo = () => {return new Promise((resolve,reject)=>{if(cache) resolve(cache)if(preRequest){preRequest.then(res=>{resolve(cache)}).catch(err=>{reject(cache)})}else{preRequest = requestUserInfo().then(res => {cache = res;resolve(res)}).catch((err) => {reject(err)})}})
}
相关文章:
多次发请求优化为发一次请求
优化 getUserInfo 请求 要求 getUserInfo 是个通用接口,在各个模块里面都有可能使用 requestUserInfo 模拟的是请求服务端真正获取用户信息的方法 业务背景 在一个页面有 A, B, C 等多个功能模块,A, B, C 模块渲染执行顺序不可控每个模块都会调用 get…...
彻底搞懂CPU的特权等级
x86 处理器中,提供了4个特权级别:0,1,2,3。数字越小,特权级别越高! 一般来说,操作系统是的重要性、可靠性是最高的,需要运行在 0 特权级; 应用程序工作在最上层,来源广泛、可靠性最低,工作在 3 特权级别。 中间的1 和 2 两个特权级别,一般很少使用。 理论上来讲,…...
JVM对象在堆内存中是否如何分配?
1:指针碰撞:内存规整的情况下 2:空闲列表: 内存不规整的情况下 选择那种分配方式 是有 java堆是否规整而决定的。而java堆是否规整是否对应的垃圾回收器是否带有空间压缩整理的能力决定的。 因此当使用Serial,ParNew等带有压缩整理过程的收…...
【小白慎入】还在手动撸浏览器?教你一招分分钟自动化操作浏览器(Python进阶)
大家好啊,辣条哥又来猛货了! 小白慎入! 目录 环境安装1 测试样例2 基本配置2.0 基本参数2.1 设置窗口2.2 添加头部2.3 网页截图2.4 伪装浏览器 绕过检测2.5案例演示 触发JS2.6 boss直聘cookie反爬绕过实践2. 7滚动到页面底部 3 进阶使用4 数…...
Unity UGUI的TouchInputModule (触摸输入模块)组件的介绍及使用
Unity UGUI的TouchInputModule (触摸输入模块)组件的介绍及使用 1. 什么是TouchInputModule组件? TouchInputModule是Unity中的一个UGUI组件,用于处理触摸输入事件。它可以让你的游戏在移动设备上实现触摸操作,如点击、滑动、缩放等。 2. …...
SpringMVC启动时非常缓慢,显示一直在部署中,网页也无法访问,,,Artifact is being deployed, please wait...
写了一个基本的SpringMVC程序进行测试,结果启动时一直显示在等待部署完毕,,, but这个地方一直显示转圈圈。。 后来通过url访问时网页一直转圈圈。。也就是等待响应。。 看了一会儿,也不知道哪儿错了,&…...
Docker 镜像操作
Docker镜像操作 我们已经介绍了容器操作,今天来了解下 Docker镜像 以及 镜像操作 。让我们一起开启镜像之旅吧。 Docker镜像 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库…...
linux下有关mysql安装和登录的一些问题记录
1. 输入mysql -u root -p出现报错 ERROR 2002 (HY000): Cant connect to local MySQL server through socket /var/run/mysqld/mysqld.sock (2) 前提:MySQL可执行文件位于/usr/local/mysql/bin目录中,如果MySQL安装路径不同,需要相应修改命令…...
DS18B20的原理及实例代码(51单片机、STM32单片机)
一、DS18B20介绍 DS18B20数字温度传感器是DALLAS公司生产的单总线器件,用它来组成一个测温系统具有线路简单,体积小,在一根通信线上可以挂很多这样的数字温度传感器,十分方便。 温度传感器种类众多,应用在高精度、高可…...
两种单例模式
1.单例模式分为两种,饿汉模式和懒汉模式.以下是饿汉模式: public class SingleTonHungry {private static SingleTonHungry singleTonHungry new SingleTonHungry();private SingleTonHungry() {}public static SingleTonHungry getInstance() {return singleTonHungry;} }2.…...
List中交集的使用
前言 新增了一个需求,需要将所有药品和对应数量库存的药房查询出来,要求:‘所有药品该药房都要有,并且库存大于购药数量’; 这就得考虑一个问题,有的药房有该药品,有的药房没有该药品…...
TypeScript基础篇 - TS的函数
目录 构造函数表达 泛型和函数 泛型函数 Contextual Typing【上下文映射,上下文类型】 泛型约束 手动指定类型 泛型的使用规范 对比 可选参数 思考:onClick中e的设计 函数重载 修改办法 操作符重载 THIS void【空返回值】 思考为什么这样…...
Vue项目如何生成树形目录结构
文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、有兴趣的可以关注一手。 前言 项目的目录结构清晰、可以帮助我们更快理顺项目的整体构成。在写文档之类的时候也比较方便。生成树形目录的方式有多种,我这里简单介绍其中一种较为简单的实现 过…...
postgresql四种逻辑复制的状态
准备 CreateCheckpoint,或者bgwriter启动时,或者创建logicalreplicationslot时都会调用LogStandbySnapshot 记录一个XLOG_RUNNING_XACTS类型的日志。日志中记录了所有提交的事务的xid(HistoricSnapshot) 启动(SNAPBUILD_BUILDING_SNAPSHOT&…...
梯度下降法和牛顿法
梯度下降法和牛顿法都是优化方法。 梯度下降法 梯度下降法和相关知识可以参考导数、偏导数、梯度、方向导数、梯度下降、二阶导数、二阶方向导数一文。梯度下降法是一种迭代地每次沿着与梯度相反方向前进的不断降低损失函数的优化方法。梯度下降只用到一阶导数的信息…...
elment-ui的侧边栏 开关及窗口联动
<template><div class"asders"><el-aside width"200px"><div class"boxbody"><div>源码外卖</div><el-switch v-model"isCollapse" :active-value"true" :inactive-value"fals…...
【从零开始学习JAVA | 第三十二篇】 异常(下)新手必学!
目录 前言: Exceptions(异常): 异常的两大作用: 异常的处理方式: 1.JVM默认处理 2.自己捕获异常 3.抛出处理 自定义异常: 异常的优点: 总结: 前言: 前…...
onnxruntime (C++/CUDA) 编译安装
一、克隆及编译 git clone --recursive https://github.com/Microsoft/onnxruntime cd onnxruntime/ git checkout v1.8.0如果克隆的时候报错: 执行以下: apt-get install gnutls-bin git config --global http.sslVerify false git config --global h…...
第三篇-Tesla P40+CentOS-7+CUDA 11.7 部署实践
第一篇-ChatGLM-webui-Windows安装部署-CPU版 第二篇-二手工作站配置 第三篇-Tesla P40CentOS-7CUDA 11.7 部署实践 硬件环境 系统:CentOS-7 CPU: 14C28T 显卡:Tesla P40 24G 准备安装 驱动: 515 CUDA: 11.7 cuDNN: 8.9.2.26 安装依赖 yum clean al…...
Unity游戏源码分享-ARPG游戏Darklight.rar
Unity游戏源码分享-ARPG游戏Darklight.rar 玩法 项目地址:https://download.csdn.net/download/Highning0007/88105464...
Windows驱动管理与系统优化:DriverStore Explorer全方位解决方案
Windows驱动管理与系统优化:DriverStore Explorer全方位解决方案 【免费下载链接】DriverStoreExplorer Driver Store Explorer [RAPR] 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 设备驱动维护是保障Windows系统稳定运行的核心环节&…...
HUNYUAN-MT 7B翻译终端Python爬虫数据清洗实战:多语言文本归一化处理
HUNYUAN-MT 7B翻译终端Python爬虫数据清洗实战:多语言文本归一化处理 1. 引言 你有没有遇到过这种情况?辛辛苦苦用Python爬虫从全球各地的网站、论坛、社交媒体上抓取了一大堆数据,准备做分析或者训练模型,结果打开一看…...
Qwen3-TTS快速部署指南:Web界面操作,无需代码基础
Qwen3-TTS快速部署指南:Web界面操作,无需代码基础 1. 引言:语音合成的零门槛体验 你是否曾经想过为自己的项目添加语音功能,却被复杂的代码和配置吓退?现在,借助Qwen3-TTS-12Hz-1.7B-Base镜像,…...
告别UnsatisfiedLinkError!OpenCV Java版环境配置的终极避坑指南(含Maven/Gradle依赖)
告别UnsatisfiedLinkError!OpenCV Java版环境配置的终极避坑指南(含Maven/Gradle依赖) 在计算机视觉领域,OpenCV无疑是开发者最常用的工具库之一。然而,当Java开发者满怀期待地引入OpenCV依赖后,却常常被U…...
告别手动记录!用CAPL脚本的file系列函数自动生成CANoe测试报告
告别手动记录!用CAPL脚本的file系列函数自动生成CANoe测试报告 在汽车电子测试领域,工程师们每天都要面对海量的测试数据——从总线负载率到错误帧统计,从信号值波动到时间戳记录。传统的手动截图、复制粘贴方式不仅效率低下,还容…...
Vercel预览部署的隐藏玩法:除了看UI,还能这样测API和监控性能
Vercel预览部署的隐藏玩法:除了看UI,还能这样测API和监控性能 当大多数开发者将Vercel的预览部署视为前端UI的"展示橱窗"时,一个更强大的应用场景正被悄然忽视——它完全可以成为全栈开发的预发布验证平台。想象一下:在…...
研发物料管理新思路:巧用SAP预留功能实现打样耗材精准管控
研发物料管理新思路:巧用SAP预留功能实现打样耗材精准管控 在制造业研发部门,物料管理一直是令人头疼的难题。不同于生产线的标准化流程,研发活动往往伴随着频繁的设计变更、小批量试制和突发性物料需求。传统的手工台账或Excel表格管理方式&…...
DriveVLA-W0:世界模型在自动驾驶中放大数据规模定律【在动作信号的基础上增加视觉自监督信号可增强VLA效果(扩散世界模型、自回归世界模型效果都不错,图4显示扩散策略稍好一些)】
第001/22页(英文原文) DRIVEVLA-W0: WORLD MODELS AMPLIFY DATA SCALING LAW IN AUTONOMOUS DRIVING Yingyan Li1∗ Shuyao Shang1∗ Weisong Liu1∗ Bing Zhan1∗ Haochen Wang1∗ Yuqi Wang1 Yuntao Chen1 Xiaoman Wang2 Yasong An2 Chufeng Tang2 Lu Hou2 Lue Fan1B Zh…...
linux-系统函数
Linux 系统函数详解 Linux 系统函数是用户程序与内核交互的底层接口,通过系统调用(syscall)实现。以下是核心分类及典型函数: 1. 文件操作函数 #include <fcntl.h> int open(const char *pathname, int flags, mode_t mode)…...
Arrow终极指南:5步掌握可视化游戏叙事设计工具
Arrow终极指南:5步掌握可视化游戏叙事设计工具 【免费下载链接】Arrow Game Narrative Design Tool 项目地址: https://gitcode.com/gh_mirrors/arrow/Arrow Arrow是一款免费开源的游戏叙事设计工具,专门用于创建互动非线性故事和文本冒险游戏。这…...
