promise缓存与缓存思想的总结

news2024/12/24 8:42:10

promise缓存与缓存思想的总结

  • JS单例模式
  • 关于promise缓存

JS单例模式

单例模式,保证一个类有且仅有一个实例,并提供一个访问它的全局访问点

我们举个简单的例子

		class SingletonFLX {
			constructor(name, age) {
				this.name = name;
				this.age = age;
			}
			//静态方法
			static getInstance(name, age) {
				if(!this.instance) {
					this.instance = new SingletonFLX(name, age);
				}
				return this.instance;
			}
		}

		let flx = SingletonFLX.getInstance('flx', 25);
		let cxy = SingletonFLX.getInstance('cxy', 23)

		console.log(flx === cxy); //true
		console.log(flx)
		console.log(cxy)

在这里插入图片描述

关于缓存

  • 缓存是计算机已经接收并使用过一次,然后保存以备将来使用的数据。

关于Map数据结构常见的用法

  • 缓存数据:使用Map来缓存经常使用的数据,避免重复计算或请求,可以减少网络请求和计算时间,提高页面加载速度和响应速度。


关于promise缓存

问题来源:有一个子组件,mounted里面有一次网络请求。一个父页面使用50次这个子组件,那这个请求会发50次。我们实际需求是让它发一次就行


如何解决这个问题?

  1. 方式一:使用单例模式,完成缓存
// cache.js 

// 缓存
const cache = null;
// 计数用
let count = 0;

// 等待时间用的函数
async function delay(ms = 200) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

export async function getData() {
    // 计数
    const myCount = count++;
    // 第一步:如果缓存中有数据,就取缓存中的
    if (cache) { return cache; }
    // 第二步:如果不是第一次请求,就让等待
    // 第一次是0
    if (myCount!=0) {
        while (!cache) { 
        	await delay();
        }
    } else {
        // 第三步:如果是第一次请求,就发远程请求
        cache = await fetchData();
    }

    // 刷新 cache 的时候用
    count--; 
    return cache;
}
  1. 方式二:使用Map缓存promise
const cacheMap = new Map();

// 一般来说,key用url+params拼接成
function generateCacheKey(config) {
  return config.url + '?' + qs.stringify(config.params)
}

getData(){
   // 通过URL,生产cacheKey
   const cacheKey = generateCacheKey(URLConfig);
   
   // 如果缓存中没有,创建promise且加入缓存中
   if(!cacheMap.has(cacheKey)){
          const myPromise = fetchData();
          cacheMap.set(cacheKey, myPromise);
   }

    // 如果有的话,返回缓存中的
    return cacheMap.get(cacheKey);
}

其实缓存就是种思想,如上面说的。可以用别的方式实现缓存,不一样非要用Map,当然推荐用Map。Map写起来比别的方便。

// 用来缓存Promise对象的数组 { key: url+param, value: promise }
let promiseList = []

// 检查是否有相同的promise
function checkPromise (url,param) {

  let key = url+JSON.stringify(param)
  let res = promiseList.filter(item => item.key === key)
  
   // 如果有相同的进行中的promise,直接返回
   // 如果没有相同的则需要存入当前的Promise并返回
  if (res.length>0) {
    console.log('存在并发请求')
    return res[0].value
  } else {
    return false
  }
}

function getData(){
  const myPromise = null;
  let cachePromise = checkPromise(url,param)
  if(cachePromise==false){
        myPromise = fetchData();
  		promiseList.push({
    		key: url+JSON.stringify(param),
    		value: myPromise,
  		})
  }else{
     myPromise  = cachePromise;
  }
  return myPromise;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/531433.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

港联证券投资前瞻:碳酸锂价格持续反弹 银行板块步入可积极配置阶段

昨日,两市股指全线反弹走高,沪指涨超1%收复3300点;创业板指午后涨超2%;截至收盘,沪指涨1.17%报3310.74点,深成指涨1.57%报11178.62点,创业板指涨2.11%报2299.93点,上证50指数涨1.75%…

【案例教程】Biome-BGC生态系统模型与Python融合技术应用

Biome-BGC是利用站点描述数据、气象数据和植被生理生态参数,模拟日尺度碳、水和氮通量的有效模型,其研究的空间尺度可以从点尺度扩展到陆地生态系统。 在Biome-BGC模型中,对于碳的生物量积累,采用光合酶促反应机理模型计算出每天…

无缝接入最新版NewBing

无缝接入最新版NewBing 1、NewBing 的接入网址 : 必应(bing.com) 2、接入方法: (1)必须使用 Microsoft Edge 浏览器 (2)注册一个自己的账号,注册步骤参考如下您可以通过以下步骤注册 Microsoft 账户 1.访问Microsoft的注册帐户页面 2.点击”创建账户”按钮。 3…

刷题65:不同的二叉搜索树

题意描述: 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 思路: 1、确定dp数组(dp table)以及下标的含义dp[i] :…

OA系统功能测试分析和学习教程(超详细)

OA系统可以简单快速地建立企业级的办公自动化系统。 办公自动化系统是员工及管理者使用频率最高的应用系统,可以极大提高公司的办公效率,帮助企业节省数字化、信息化办公的成本。本文中的OA系统来自于下面的资源: 包含诸多系统各功能模块&…

个人黄金投资要注意什么?如何降低黄金投资交易风险

黄金保值性强,自带避免功能,因此在投资者的理财组合中总能看到它的身影。但不可否认的是,黄金投资交易风险仍然存在。投资者在入场前应该多方了解,减小风险的危害。 黄金投资交易风险一、市场波动 全球影响黄金价格的因素有很多&…

51单片机中断系统

中断系统 1、中断介绍2、中断结构及相关寄存器中断满足的条件以及使用 3、外部中断实验外部中断介绍外部中断配置硬件设计软件设计 1、中断介绍 我们先来举一个生活事例: 你打开火,烧上一壶水。然后去洗衣服,在洗衣服的过程中,突…

python进程

队列 简介 在windows中,启动一个程序资源等于一个进程,进程是由多个线程组成的,进程理解为管理层,而线程是工人 通俗解释: 进程:能够完成多任务,比如,在同一台电脑上能够同时运行…

苹果手机怎么删除软件?彻底删除顽固app的3个方法!

案例:苹果手机有流氓软件删不掉怎么办? 【好烦,在网页上误点下载了一些流氓软件,怎么都删不掉,我该怎么办?求大神支招!】 在苹果手机上删除软件通常是一个简单的过程,但有时候可能会…

【Java 基础】反射

反射是框架的灵魂。动态代理、很多框架(SoringIOC、AOP等)中都用到了反射。 概述: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法(包括私有的);对…

一款高效的企业级表格可视化搭建解决方案DripTable

DripTable 是京东零售推出的一款用于企业级中后台的动态列表解决方案,项目基于 React 和 JSON Schema,旨在通过简单配置快速生成页面动态列表来降低列表开发难度、提高工作效率。 DripTable 目前包含以下子项目:drip-table、drip-table-gene…

SpringBoot实战(四)获取接口请求中的参数(@PathVariable,@RequestParam,@RequestBody)

一:获取参数 SpringBoot提供的获取参数注解包括:PathVariable,RequestParam,RequestBody,三者的区别如下表: 二、java基础(spring注解PathVariable和RequsetParam的区别还有RequestBody) Path…

“AI孙燕姿”们侵了谁的权?

“2003年大火的歌手:孙燕姿;2023年大火的歌手:AI孙燕姿”。在B站,这条评论获赞2800多,而被网友们集体点赞的是用AI克隆孙燕姿声音后演唱其他歌曲的视频。 截止目前,Up主们打造的“AI孙燕姿”已翻唱了百余首…

每日学术速递5.14

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.An Inverse Scaling Law for CLIP Training 标题:CLIP 训练的逆比例定律 作者:Xianhang Li, Zeyu Wang, Cihang Xie 文章链接:https://arxiv.…

【Linux】Linux编辑器-gcc/g++使用

目录 一、背景知识 二、gcc是如何完成的 1、预处理(进行宏替换) 2、编译(生成汇编) 3、汇编(生成机器可识别代码) 4、链接(生成可执行文件或库文件) 4.1、静态库 4.2、动态库 4.3、动静态库的比较 三、gcc常见的选项 一、背景知识 计算机是二进制读取文件的,我们…

HHDBCS及HHDESK的资源加密功能

安全性,是头等重要的事情。HHDBCS及HHDESK均有一项实用功能,资源加密。 HHDBCS 打开HHDBCS,出现连接管理界面(或者在运行过程中,点击连接管理),点击如下图箭头所指处的图标即可 HHDESK 点击主…

全球范围内的数字化时代,挑战和价值有哪些?

近年来,数字经济的发展趋势越来越明显,尤其是随着疫情的影响,加速了传统产业向数字化、网络化和智能化产业的转型和升级。全球数字经济规模不断扩大,体量连年增长,根据中国信息通信研究院报告显示,2019年全…

VMware虚拟机,匹配库中的文件系统文件夹层次结构

不需要把虚拟机文件复制到本地就不需要勾选“匹配库中的文件系统文件夹层次结构”这个选项。 但是,即便是勾选“匹配库中的文件系统文件夹层次结构”这一选项,也可以不勾选下一个选项卡的任何选项。

Midjourney AI 官方中文版已开启内测申请;OpenAI 正准备向公众发布一款新的开源语言模型。

🚀 Midjourney AI 官方中文版已开启内测申请,搭载在 QQ 频道上,召唤机器人进行作画。 Midjourney AI 官方中文版已开启内测申请,搭载在 QQ 频道上,召唤机器人进行作画。 可调用 MJ 和 Niji 的最新模型和所有参数&…

Python源码怎么运行?

要运行Python源码,您需要安装Python解释器。Python解释器是一种软件,它可以读取Python源代码并将其转换为计算机可以理解和执行的指令。 在Windows操作系统上运行Python源代码的步骤: 在您的计算机上下载并安装Python解释器。您可以从Pyth…