当前位置: 首页 > news >正文

多次发请求优化为发一次请求

优化 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)})}})
}
http://www.lryc.cn/news/97806.html

相关文章:

  • 彻底搞懂CPU的特权等级
  • JVM对象在堆内存中是否如何分配?
  • 【小白慎入】还在手动撸浏览器?教你一招分分钟自动化操作浏览器(Python进阶)
  • Unity UGUI的TouchInputModule (触摸输入模块)组件的介绍及使用
  • SpringMVC启动时非常缓慢,显示一直在部署中,网页也无法访问,,,Artifact is being deployed, please wait...
  • Docker 镜像操作
  • linux下有关mysql安装和登录的一些问题记录
  • DS18B20的原理及实例代码(51单片机、STM32单片机)
  • 两种单例模式
  • List中交集的使用
  • TypeScript基础篇 - TS的函数
  • Vue项目如何生成树形目录结构
  • postgresql四种逻辑复制的状态
  • 梯度下降法和牛顿法
  • elment-ui的侧边栏 开关及窗口联动
  • 【从零开始学习JAVA | 第三十二篇】 异常(下)新手必学!
  • onnxruntime (C++/CUDA) 编译安装
  • 第三篇-Tesla P40+CentOS-7+CUDA 11.7 部署实践
  • Unity游戏源码分享-ARPG游戏Darklight.rar
  • 类型转换运算符
  • Kafka 入门到起飞系列 - 消费者组管理、位移管理
  • SpringBoot——数据层三组件之间的关系
  • LeetCode647.Palindromic-Substrings<回文子串>
  • React的hooks---useContext
  • 【Terraform学习】TerraformCloud入门介绍(快速入门)
  • linux实现运行java分包部署
  • 数据安全之全景图系列——数据分类分级落地实践
  • C++实现MySQL数据库连接池
  • day4 驱动开发 c语言学习
  • history命令:显示命令执行时间