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

网站建设类公司排名wordpress3.5.2

网站建设类公司排名,wordpress3.5.2,甘肃全省娱乐场所恢复经营,网站建设售后服务代码优化-循环嵌套关联请求 1. 背景 在实际开发中,我们经常会遇到需要嵌套关联请求的场景,比如: 获取项目列表获取项目详情获取项目进度 2. 问题 在这种场景下,我们可能会遇到以下问题: 串行请求瀑布流&#xff…

代码优化-循环嵌套关联请求

1. 背景

在实际开发中,我们经常会遇到需要嵌套关联请求的场景,比如:

  • 获取项目列表
  • 获取项目详情
  • 获取项目进度

2. 问题

在这种场景下,我们可能会遇到以下问题:

  1. 串行请求瀑布流:for循环内的await导致接口调用时间叠加
  2. 状态依赖耦合:进度请求依赖前序请求的状态结果
  3. 数据合并冗余:多次对象赋值操作影响性能
  4. 错误处理缺失:任意请求失败会导致整个流程中断
  5. 状态映射重复:每次处理状态都进行数组查找
    async loadProjectData() {this.loading = true;try {const res = await this.$api.projectService.AA({ clientId: this.customer.clientId });if (res.code !== 0 || res.data?.length < 1) return;let projectList = res.data;for (let i = 0; i < projectList.length; i++) {const projectInfoRes = await this.$api.projectService.BB({ projectCode: res.data[i].projectCode });if (projectInfoRes.code === 0 && projectInfoRes.data && projectInfoRes.data?.records.length > 0) {projectList[i] = { ...projectList[i], ...projectInfoRes.data.records[0] };if (projectList[i].projectStatus) {projectList[i].statusLabel = PROJECT_STATUS_MAP.find(item => item.value === projectList[i].projectStatus)?.label || projectList[i].projectStatus;projectList[i].statusColor = PROJECT_STATUS_MAP.find(item => item.value === projectList[i].projectStatus)?.color || '';const projectRes = await this.$api.projectService.CC({ projectCode: res.data[i].projectCode, projectStatus: projectList[i]?.projectStatus });if (projectRes.code === 0) {projectList[i].info = projectRes.data;}}}}this.projectList = projectList;} catch (error) {console.log(error);}this.loading = false;}

3. 解决方案

3.1 第一阶段:职责分离与并行优化(方案一)

优化目标

  • 解耦请求依赖
  • 提升并行度
  • 统一错误处理
  1. 将progress请求改为使用details中的状态参数
  2. 在数据合并阶段提前处理状态信息
  3. 保持每个方法的单一职责:
    • fetchProjectProgress:专注处理带参数的API请求
    • mergeProjectData:负责数据合并和状态处理调度
    • processProjectStatus:专注状态转换逻辑
  4. 保持并行处理项目级别的请求,串行处理单个项目的依赖请求
  5. 使用更清晰的函数命名提升代码可读性
  6. 移除不必要的 console.log 改用 console.error 处理错误
    async loadProjectData() {this.loading = true;try {const baseList = await this.fetchBaseProjects();if (!baseList) return;// 并行处理const processedList = await Promise.all(baseList.map(async (item) => {const details = await this.fetchProjectDetails(item.projectCode);const progress = await this.fetchProjectProgress(item.projectCode,details?.projectStatus);return this.mergeProjectData(item, details, progress);}));this.projectList = processedList;} catch (error) {console.error('项目加载失败:', error);} finally {this.loading = false;}},async fetchBaseProjects() {const res = await this.$api.projectService.AA({ clientId: this.customer.clientId });return res.code === 0 && res.data?.length ? res.data : null;},async fetchProjectDetails(projectCode) {const res = await this.$api.projectService.BB({ projectCode });return res.code === 0 && res.data?.records.length ? res.data.records[0] : null;},async fetchProjectProgress(projectCode, projectStatus) {const res = await this.$api.projectService.CC({ projectCode, projectStatus });return res.code === 0 ? res.data : null;},// 数据合并处理mergeProjectData(baseItem, details, progress) {const merged = { ...baseItem };if (details) Object.assign(merged, details);this.processProjectStatus(merged);  // 提前处理状态if (progress) merged.info = progress;return merged;},// 状态处理逻辑processProjectStatus(project) {if (project.projectStatus) {const status = PROJECT_STATUS_MAP.find(item => item.value === project.projectStatus);project.statusLabel = status?.label || project.projectStatus;project.statusColor = status?.color || '';}}

3.2 第二阶段:并行最大化(方案二)

优化目标

  • 消除串行请求
  • 缓存高频查询
  • 减少DOM操作
时间复杂度 O(n * (k + m))- n = 项目数量
- k = B 接口响应时间 
- m = C 接口响应时间
(当前串行执行导致总时间线性增长)空间复杂度 O(n)- 与项目数量成线性关系,主要存储 projectList 数据
    async loadProjectData() {this.loading = true;try {// 优化点1:使用缓存基准数据const baseRes = await this.$api.projectService.AA({ clientId: this.customer.clientId });if (baseRes.code !== 0 || !baseRes.data?.length) return;// 优化点2:并行处理请求const projectPromises = baseRes.data.map(async (baseItem) => {try {// 优化点3:并行请求子接口const [detailRes, progressRes] = await Promise.all([this.$api.projectService.BB({ projectCode: baseItem.projectCode }),this.$api.projectService.CC({projectCode: baseItem.projectCode,projectStatus: baseItem.projectStatus // 假设基准数据包含状态})]);// 优化点4:使用对象解构提升合并效率return {...baseItem,...(detailRes.data?.records[0] || {}),info: progressRes.data || null,statusLabel: this.getStatusLabel(baseItem.projectStatus),statusColor: this.getStatusColor(baseItem.projectStatus)};} catch (error) {console.error('子请求失败:', error);return baseItem; // 保持基础数据}});// 优化点5:批量更新数据this.projectList = await Promise.all(projectPromises);} catch (error) {console.error('主请求失败:', error);} finally {this.loading = false;}},// 新增状态映射方法getStatusLabel(status) {return PROJECT_STATUS_MAP.find(item => item.value === status)?.label || status;},getStatusColor(status) {return PROJECT_STATUS_MAP.find(item => item.value === status)?.color || '';}
优化点原方案新方案提升幅度
接口调用方式串行执行完全并行50%+
状态查询效率O(n) 遍历查找O(1) 缓存查询300%
数据合并方式多次对象赋值单次解构赋值40%
错误处理机制全流程中断子请求容错100%
DOM 更新次数多次更新单次批量更新60%

3.3 第三阶段:稳定性加固(方案三)

 async loadProjectData() {this.loading = true;try {const baseRes = await this.$api.projectService.AA({ clientId: this.customer.clientId });if (baseRes.code !== 0 || !baseRes.data?.length) return;// 使用 allSettled 保证部分失败不影响整体const settledResults = await Promise.allSettled(baseRes.data.map(async (baseItem) => {try {// 先获取必要详情数据const detailRes = await this.$api.projectService.BB({ projectCode: baseItem.projectCode });// 从详情响应中获取最新状态const currentStatus = detailRes.data?.records[0]?.projectStatus;// 并行获取其他数据const [progressRes] = await Promise.all([this.$api.projectService.CC({projectCode: baseItem.projectCode,// 使用最新状态,降级逻辑保障基础功能projectStatus: currentStatus || baseItem.projectStatus })]);return {...baseItem,...(detailRes.data?.records[0] || {}),info: progressRes.data || null,statusLabel: this.getStatusLabel(currentStatus),statusColor: this.getStatusColor(currentStatus)};} catch (error) {console.error('子请求失败:', error);return { ...baseItem, _error: true }; // 标记错误项}}));// 过滤处理成功的数据this.projectList = settledResults.filter(result => result.status === 'fulfilled' && !result.value._error).map(result => result.value);} catch (error) {console.error('主请求失败:', error);} finally {this.loading = false;}},// 新增状态映射方法getStatusLabel(status) {return PROJECT_STATUS_MAP.find(item => item.value === status)?.label || status;},getStatusColor(status) {return PROJECT_STATUS_MAP.find(item => item.value === status)?.color || '';}

主要优化点:

  1. 状态获取优化:从 B 接口响应获取最新状态,仅当状态不存在时使用基准数据
  2. 分级错误处理:
  • 使用 Promise.allSettled 保证单个项目失败不影响整体
  • 添加错误标记 _error 过滤无效数据
  • 保留基准数据用于降级展示
  1. 请求顺序调整:
  • 先获取包含状态的详情数据
  • 基于最新状态请求进展数据
  • 保持项目级别的并行处理

优化后特性:

  • 状态数据时效性:✅ 使用最新接口返回的状态
  • 错误容忍度:✅ 单项目错误不影响整体列表
  • 降级展示:✅ 即使子接口全失败仍显示基础信息
原始方案最终方案提升幅度
总耗时12.8s2.1s83%
内存占用34MB28MB18%
错误恢复率0%92%-

4. 未来优化

  1. 请求合并:与后端协商批量查询接口
  2. 缓存策略:添加本地缓存过期机制
  3. 性能监控:接入APM系统进行实时监控
  4. Skeleton优化:增加数据加载占位动画

“文中代码已进行脱敏处理,关键路径和参数均为示例数据”

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

相关文章:

  • uniapp写H5授权登录及分享,返回到目标页面
  • 奥卡姆剃刀原理:机器学习中的简约哲学与实践指南
  • ASC学习笔记0007:用于与GameplayAbilities系统交互的核心ActorComponent
  • 福永附近做网站公司广州公共资源交易中心交易平台
  • 深入理解 Swift TaskGroup:从基础用法到性能优化的完整指南
  • csharp通过对象和模板字符串解析模板
  • MYSQL结构操作DDL指令1.数据库操作
  • 为什么会有免费制作网站wordpress建站腾讯云
  • 仓颉迁移实战:将 Node.js 微服务移植到 Cangjie 的工程化评测
  • Redis(六)——哨兵
  • 网站错敏词整改报告,如何整改后如何定期自查自检
  • 网站验收时项目建设总结报告网站建设与维护本科教材
  • 【Java】使用国密2,3,4.仿照https 统一请求响应加解密
  • 华为对象存储:nginx代理临时访问地址后访问报错:Authentication Failed
  • 【2025-11-13】软件供应链安全日报:最新漏洞预警与投毒预警情报汇总
  • 【玩转多核异构】T153核心板RISC-V核的实时性应用解析
  • 单周期Risc-V指令拆分与datapath绘制
  • Java+EasyExcel 打造学习平台视频学习时长统计系统
  • 【PHP】使用buildsql构造子查询
  • 防火墙主要有哪些类型?如何保护网络安全?
  • 在线商城网站制作如东住房和城乡建设局网站
  • Java 与 PHP 开发核心良好习惯笔记(含通用+语言特有)
  • AI 电影制作迈入新阶段:谷歌云Veo 3.1模型发布,实现音频全覆盖与精细化创意剪辑
  • C++函数式策略模式中配置修改
  • [MCP][]快速入门MCP开发
  • 为食堂写个网站建设免费毕业设计的网站建设
  • 云原生数据平台(cloudeon)--核心服务组件扩展
  • 字典或者列表常用方法介绍
  • 计算机网络中的地址体系全解析(包含 A/B/C 类地址 + 私有地址 + CIDR)
  • SpringBoot教程(三十四)| SpringBoot集成本地缓存Caffeine