前端 使用递归函数优化循环请求过程

目录

背景:

简介: 

举个栗子🌰:

这是我们的原始代码:

这是改造后的代码:

总结一下:


背景:

在软件开发中,经常会遇到需要进行多次循环请求的情况。然而,传统的循环请求方式会导致代码冗长、可读性差,并且无法在每次循环之后再进行下一次循环请求。为了解决这个问题,我们可以使用递归函数来优化循环请求过程,实现更简洁、高效的代码结构。 


简介: 

递归函数是一种自我调用的函数,它可以在每次调用时处理不同的参数,并根据特定的条件来决定是否继续调用自身。通过递归函数,我们可以实现在每次循环之后再进行下一次循环请求的需求。

递归函数是一种自我调用的函数,它可以在每次调用时处理不同的参数,并根据特定的条件来决定是否继续调用自身。通过递归函数,我们可以实现在每次循环之后再进行下一次循环请求的需求。

 一般来说过程是这样的:

  1. 首先,我们需要定义一个递归函数,例如loopRequests。该函数接收一个参数,用于表示当前循环的索引。在函数内部,我们可以根据索引来获取相应的请求参数,并进行请求处理。
  2. 在每次循环请求中,我们使用await关键字来等待请求的结果。这样可以确保每次请求都是按顺序进行,并且在获取到结果之后再进行下一次循环。
  3. 在处理完请求结果后,我们可以根据特定的条件来判断是否需要进行下一次循环请求。如果满足条件,则通过递归调用loopRequests函数,并传入递增的索引作为参数,来进行下一次循环请求。
  4. 当索引超过循环范围时,就表示所有的请求都已完成。此时,我们可以进行后续的操作,如数据处理、构建数据结构等。

举个栗子🌰:

接上一篇文章,我们可以在循环请求的基础上进一步优化代码。
回顾点击:Promise.all使用

这是我们的原始代码:

这是我们没有控制请求顺序的情况下使用Promise.all等待所有请求完成后进行后续的数据处理操作,这就可能导致最终的结果集是包含一二三四厂的分组,但是展示顺序可能是二一三四或者一四三二等等

initRoleTreeOfManagements() {const manageUnitUUIDs = ['1', '2', '3', '4'];const manageUnitNames = ['一厂', '二厂', '三厂', '四厂'];const endTreeData = [];const promises = manageUnitUUIDs.map((manageUnitUUID, index) => {return pbService('service.Service', 'queryListByAttr', {query_fields: {sysisdelete: '0',manage_unit_uuid: manageUnitUUID,},result_fields: 'uuid,name,uuid',order_fields: '',}).then(res => {if (res && res.resultset) {res.resultset.push({role_name: manageUnitNames[index],app_uuid: this.$TREE_ROOT,});endTreeData.push(...res.resultset);}})});console.log(endTreeData)Promise.all(promises).then(() => {this.roleTreeData = loopTreeData(endTreeData, this.$TREE_ROOT, {idFiled: 'uuid',nameField: 'name',parentField: 'uuid',});},

如果想要控制结果集展示顺序,就可以通过控制请求顺序的方式(当然也可以对最终结果集进行排序哈,本文主要围绕使用递归函数来进行解读)控制结果集的顺序

这是改造后的代码:
initRoleTreeOfManagements() {const manageUnitUUIDs = ['1', '2', '3', '4'];const manageUnitNames = ['一厂', '二厂', '三厂', '四厂'];const endTreeData = [];const loopRequests = (index) => {if (index >= manageUnitUUIDs.length) {console.log(endTreeData);this.roleTreeData = loopTreeData(endTreeData, this.$TREE_ROOT, {idFiled: 'uuid',nameField: 'name',parentField: 'uuid',});return;}pbService('service.Service', 'queryListByAttr', {query_fields: {sysisdelete: '0',manage_unit_uuid: manageUnitUUIDs[index],},result_fields: 'uuid,name,uuid',order_fields: '',}).then(res => {if (res && res.resultset) {res.resultset.push({role_name: manageUnitNames[index],app_uuid: this.$TREE_ROOT,});endTreeData.push(...res.resultset);}loopRequests(index + 1); // 递归调用,进行下一次循环});};loopRequests(0); // 初始调用,索引为0
}

在这个修改后的代码中,我们定义了一个名为loopRequests的递归函数,它接收一个参数index,用于表示当前循环的索引。

在每次循环中,我们首先判断是否满足循环的终止条件,即index是否大于manageUnitUUIDs数组的长度。如果满足条件,即所有请求都已完成,我们打印出endTreeData数组,并将其作为参数调用loopTreeData函数来构建树状数据结构。

如果不满足终止条件,我们发起异步请求,并在请求完成后处理结果。在处理结果后,我们通过递归调用loopRequests函数并将索引递增,来进行下一次循环。

通过这样,可以实现在每次循环之后再进行下一次循环请求的需求。每次请求的结果会被添加到endTreeData数组中,并在所有请求完成后进行后续操作。

总之,就是使用递归函数帮我们优化循环请求过程。


看懂了吗?不懂?没关系再看个简单的(不额外解释了,看注释吧):

// 首先。定义一个名为loopRequests的递归函数。
function loopRequests(index) {
// 在函数内部,我们定义了一个requestData数组,用于模拟请求的数据。const requestData = [{ id: 1, name: 'John' },{ id: 2, name: 'Jane' },{ id: 3, name: 'Mike' },{ id: 4, name: 'Sarah' },];// 定义循环的终止条件 ,在每次循环中,我们首先判断是否满足循环的终止条件,即index是否大于等于requestData数组的长度。如果满足条件,即所有请求都已完成,我们打印出"所有请求已完成"并返回。if (index >= requestData.length) {console.log("所有请求已完成");return;}// 如果不满足终止条件,模拟异步请求,使用setTimeout函数来延迟1秒执行,并在请求完成后处理结果setTimeout(() => {const request = requestData[index];console.log(`请求 ${request.id} 完成,响应数据为:`, request);// 在延迟结束后,我们获取当前请求的数据,处理请求结果,例如构建数据结构// 在这里进行相应的处理操作loopRequests(index + 1); // 递归调用,进行下一次循环}, 1000);
}// 调用递归函数,初始索引为0
loopRequests(0);

总结一下:

使用递归函数优化循环请求过程可以提高代码的可读性和可维护性,同时实现在每次循环之后再进行下一次循环请求的需求。它是一种简洁、高效的编程技巧,在处理多次循环请求时非常有用。

通过使用递归函数优化循环请求过程,我们可以获得如下好处:

  1. 简洁的代码结构:使用递归函数可以避免冗长的循环代码,并将每次请求的处理逻辑集中在一个函数中,使代码更加清晰易读。
  2. 可控的请求顺序:递归函数可以确保每次请求都按顺序进行,并在获取到结果后再进行下一次请求,避免了并发请求带来的问题。
  3. 灵活的条件判断:通过在递归函数中添加条件判断语句,我们可以灵活地控制是否需要进行下一次循环请求,根据需求进行定制化的处理。

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

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

相关文章

财务收支系统怎么做,财务收支记账软件管理系统教程

财务收支系统怎么做,财务收支记账软件管理系统教程 一、前言 以下软件操作教程以 佳易王财务收支记账软件V17.0为例说明 件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 财务收支记账管理系统软件可按需定制 1、权限设置:管理员账…

【Java程序设计】【C00345】基于Springboot的船舶监造管理系统(有论文)

基于Springboot的船舶监造管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 项目获取 🍅文末点击卡片获取源码🍅 开发环境 运行环境:推荐jdk1.8; 开发工具:eclipse以及i…

第四届数字信号与计算机通信国际学术会议(DSCC 2024)

#高录用,稳检索# #高校背书,更可靠# DSCC 2024已通过SPIE出版社审核,ISSN号已确定:ISSN: 0277-786X,往届均已见刊EI检索! 第四届数字信号与计算机通信国际学术会议(DSCC 2024) 2024 …

Linux服务器mamba环境配置

# windows目前装不了 目录 安装步骤: 可能出现的问题: 安装步骤: 需要的配置: CUDA(11.6) pytorch (1.12) 先装好和CUDA版本对应的torch!!不然后面问题一堆 packaging triton 官方readme.md文件要…

智慧校园数据可视化有什么好处?怎么推进数字化校园方案?

在当今数字化时代,越来越多学校开始实施智慧校园计划,旨在为学生和教师提供更高效、便捷的学习和教学环境。智慧校园运用互联网、大数据、人工智能等技术,对校园内各信息进行收集、整合、分析和应用,实现教学、管理、服务等多方面…

华为openGauss数据库命令大全:一站式掌握核心运维操作

引言: 华为openGauss作为一款高性能、安全可控的企业级数据库产品,其强大功能离不开一套完善且高效的命令行工具。本文将为您详细介绍openGauss数据库的常用命令,帮助您快速掌握数据库的日常运维操作。 一、服务管理命令 启动数据库服务 gs…

链表题牛客

链表反转 ListNode* ReverseList(ListNode* head){ListNode* a NULL;ListNode* b head;while(b!NULL){ListNode* cb->next;b->nexta;ab;bc;}return a; }链表内指定区间反转 ListNode* reverseBetween(ListNode* head, int m, int n) {ListNode* res new ListNode(-1…

python和Vue开发的RBAC用户角色权限管理系统

后端框架:python的FastAPI作为后端服务和python-jose作为JWT认证 前端框架:Vue3构建页面和Vue Router作为路由管理,Pinia作为数据存储,Vite作为打包工具 可以实现菜单控制和路由控制,页面里面有按钮权限控制&#xf…

【R包开发:包的组件】 第4章 包的元数据

DESCRIPTION(描述文件) 的作用是存储包中重要的元数据。当第一次开发包时, 你会 使用这个文件记录包运行时所需要的包。然而,随着时间的流逝,当开始与他人分享包 时,元数据文件变得越来越重要,因为它指定了谁可以使用它(许可证),以及如果包有 什么问题时需要和谁(你!)联系…

客户端测试 可测性改进-学习记录

客户端测试面临的挑战 难点: 业务复杂,产品多,技术栈多样 测试过程的痛点: 配置-》执行-〉检查-》结果 手工测试前置配置操作极其繁琐:安装测试包-〉进入debug页面-》设置h-〉设置AB test-》锁定rn包-〉进入业务页…

java解决跨域问题

浏览器js在访问服务器中的资源时,会出现同一页面或者不同域名(协议,IP,端口)不可访问 例如:file://d://test.html页面(file协议)中通过ajax访问服务器api.test.com的接口(http协议),由于协议不同,此时会出现浏览器访问…

CVE-2020-15778 OpenSSH命令注入漏洞

预备知识 漏洞描述 OpenSSH8.3p1及之前版本中scp的scp.c文件存在操作系统命令注入漏洞。该漏洞即使在禁用ssh登录的情况下,但是允许使用scp传文件,而且远程服务器允许使用反引号(`)。攻击者可利用scp复制文件到远程服务器时,执行带有payload的scp命令,从而在后续利用中ge…

相对全面的四足机器人驱动规划MATLAB和Simulink实现方式(足端摆线规划,Hopf-CPG,Kimura-CPG)

许久没更新四足机器人相关的博客文章,由于去年一整年都在干各种各样的~活,终于把硕士毕业论文给写好,才有点时间更新自己的所学和感悟。步态规划和足端规划只是为了在运动学层面获取四足机器人各关节的期望角位移和速度信号,再由底…

Glide报错:FileNotFoundException: XX open failed: EACCES (Permission denied)

问题描述: targetVersion:33,Manifest已经申请了READ_MEDIA_IMAGES,WRITE_EXTERNA权限,代码里也动态申请了权限。但是通过系统相册选择图片后,将uri转为path之后,用glide加载path一直报这个错误。如果用gl…

JavaScript语法和数据类型

基础 JavaScript 借鉴了 Java 的大部分语法,但同时也受到 Awk、Perl 和 Python 的影响。 JavaScript 是区分大小写的,并使用 Unicode 字符集。举个例子,可以将单词 Frh(在德语中意思是“早”)用作变量名。 var Frh …

Nacos部署(二)Linux部署Nacos2.3.x集群环境

😊 作者: 一恍过去 💖 主页: https://blog.csdn.net/zhuocailing3390 🎊 社区: Java技术栈交流 🎉 主题: Nacos部署(二)Linux部署Nacos2.3.x集群环境 ⏱️…

Xshell连接虚拟机非常慢

问题: 打开虚拟机连接时发现过了几分钟依然卡着在,但是主机可以ping通虚拟机,虚拟机也可以ping通主机感觉很奇怪,查询后得知需要修改ssh设置 打开配置 vim /etc/ssh/sshd_config 修改配置 找到 UseDNS,去掉前面的#号…

React中 类组件 与 函数组件 的区别

类组件 与 函数组件 的区别 1. 类组件2. 函数组件HookuseStateuseEffectuseCallbackuseMemouseContextuseRef 3. 函数组件与类组件的区别3.1 表面差异3.2 最大不同原因 1. 类组件 在React中,类组件就是基于ES6语法,通过继承 React.component 得到的组件…

面试八股文之JAVA基础

JAVA基础 DNS、CDN?如何实现对象克隆?父子类静态代码块, 非静态代码块, 构造方法执行顺序?String s new String("abc") 创建了几个对象, 分别放到哪里?OSI网络模型七层?应用层协议?http协议和https协议区别?传输层协…

蓝桥杯小白月赛3.23

题目描述&#xff1a; AC代码&#xff1a; #include <iostream> #include<cstring> #include<algorithm>using namespace std;const int N 2e510; string str[N]; //写上&会速度更快一些 bool cmp(const string &s1,const string &s2) {//例…