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

question:使用同一请求数据且渲染顺序不确定时复用

问题:组件A和组件B都用某个请求的数据,但是不知道组件A和组件B谁先渲染,怎么设计请求函数可以复用数据?

答案:通过缓存请求状态复用 Promise来设计请求函数,确保无论哪个组件先发起请求,最终都能共享同一份数据。关键是:Map数据结构缓存请求

// 缓存对象:key为请求标识(如URL),value为{ promise: 请求的Promise, data: 缓存的数据 }
const requestCache = new Map();/*** 复用请求的工具函数* @param {string} key - 请求的唯一标识(如API地址)* @param {Function} requestFn - 实际发起请求的函数(返回Promise)* @returns {Promise} - 返回请求的Promise,确保同一key的请求只发起一次*/
export function fetchSharedData(key, requestFn) {// 如果缓存中已有该请求,直接返回缓存的Promiseif (requestCache.has(key)) {const { promise } = requestCache.get(key);return promise;}// 发起新请求,并缓存Promiseconst promise = requestFn().then((data) => {// 请求成功后,更新缓存中的数据requestCache.set(key, { promise, data });return data;}).catch((error) => {// 请求失败时,清除缓存(允许重试)requestCache.delete(key);throw error; // 抛出错误供组件捕获});// 先缓存Promise(此时请求可能还在进行中)requestCache.set(key, { promise, data: null });return promise;
}

使用

// 假设这是实际的API请求函数
function fetchUserInfo() {return fetch('/api/user').then(res => res.json());
}// 组件A或者B
function ComponentA() {const [user, setUser] = React.useState(null);React.useEffect(() => {// 用key='userInfo'标识请求,确保和另一个组件复用fetchSharedData('userInfo', fetchUserInfo).then(data => setUser(data)).catch(err => console.error('请求失败:', err));}, []);return <div>组件A: {user?.name}</div>;
}

http://www.dtcms.com/a/391548.html

相关文章:

  • Redis群集三种模式介绍和创建
  • 【LeetCode 每日一题】1935. 可以输入的最大单词数
  • eeprom和flash的区别
  • [vibe code追踪] 分支图可视化 | SVG画布 | D3.js
  • [硬件电路-264]:数字电路的电源系统的主要特性包括哪些
  • 算法题(212):01背包(空间优化)
  • TP4054和TP4056对比
  • AD5165(超低功耗逻辑电平数字电位器)芯片的详细用法
  • 38、多模态模型基础实现:视觉与语言的智能融合
  • 租赁合同管理系统如何使用?功能深度解析
  • 构建高质量RAG知识库,文档解析破解AI应用的数据质量难题
  • CS课程项目设计17:基于Face_Recognition人脸识别库的课堂签到系统
  • 跨平台开发地图:客户端技术选型指南 | 2025年9月
  • 隐私保护 vs 技术创新:AI 时代数据安全的边界在哪里?
  • 如何在网页开发中建立数字信任?
  • 网站模版 网站建站 网站设计源码模板
  • 访问飞牛NAS的时候为啥要加:5667?不能隐藏它吗?啥是重定向?HTTPS为啥是红的?
  • 端口切换导致 mcp 和 gimini cli 连接失败
  • (论文速读)KL-CLIP:零采样异常分割的K均值学习模型
  • FlexE实践笔记
  • 搭建Redis群集模式
  • 视觉SLAM第13讲:实践,设计SLAM系统
  • 【论文阅读】WebWalker: Benchmarking LLMs in Web Traversal
  • 页面水印记录
  • 快速学习kotlin并上手 Android 开发指南
  • Linux进程控制(下):进程等待和进程替换
  • 如何检查数据库是否处于恢复模式
  • AI一周资讯 250913-250919
  • Livox-mid-360录制的.lvx2文件转化为.bag文件(TBC)
  • 【 svn】自动重试: cleanup + update