前端编程训练 异步编程篇 请求接口 vue与react中的异步

文章目录
      • 前言
      • 代码执行顺序的几个关键点
      • 接口请求
      • vue与react中的异步
        • vue中的异步
        • react的state修改异步

在这里插入图片描述

前言

本文是B站三十的前端课的笔记前端编程训练,异步编程篇

代码执行顺序的几个关键点
  1. 我们可以理解为代码就是一行一行,一句一句是执行(定义变量,方法存在提升情况)
  2. 如果有复杂表达式,表达式从右往左执行(赋值,方法调用,三元等等)
  3. 异步特性,代码一行行执行,但是我们调用了一个异步操作,JS放入异步队列中,等待任务完成,并且当前这次执行已经完成,则执行异步部分
接口请求

接口请求是我们日常工作中最常见的异步操作,通常接口的请求是时间不定的,肯定要花一点时间的。接口请求的异步我们不用考虑什么微任务和宏任务

  1. 获取前三用户的积分,做一个图表。但是问题在于,图表x轴的日期,在一个接口。用户列表在一个接口,用户积分又是另外一个接口
    利用async await一步一步就可以实现但是必须请求完上一个请求才能执行下一步代码会影响性能 我们可不可以让没有依赖的请求同时并发从而优化性能并节省时间呢

使用Promise.all实现并发效果 优化性能并节省时间

function getFinnalData() {let option = {yAxis: {type: "value"},tooltip: {},xAxis: {type: "category",data: []},series: []}//Promise.all,会等数组里两个Promise异步操作都返回了才进入thenPromise.all([axios.get("http://localhost:8000/getDate"),axios.get("http://localhost:8000/getUser")]).then((res) => {//res[0]-日期接口的返回 res[1]-用户列表接口的返回//日期数据取出来作为x轴option.xAxis.data = res[0].data.recentDate//取出用户列表const userList = res[1].data.userList//排序userList.sort((preuser, nowuser) => {return preuser.id - nowuser.id;})//筛选出id前三的userList.splice(3, userList.length - 1);//Promise.all保证三个接口都请求成功了,在进行series的操作Promise.all([axios.get("http://localhost:8000/getUserNumber?id=" + userList[0].id),axios.get("http://localhost:8000/getUserNumber?id=" + userList[1].id),axios.get("http://localhost:8000/getUserNumber?id=" + userList[2].id)]).then((res) => {//三个请求都完成进入thenres.forEach((singleUserNumberres) => {let _series = {name: singleUserNumberres.data.name,data: singleUserNumberres.data.recentNumber,type: 'line'}option.series.push(_series);//执行完上面的85行,数据就完整了。let chartDom = document.getElementById('container');let myChart = echarts.init(chartDom);myChart.setOption(option);})})})
}
  1. 把一个大数组拆分成10个一组,发送给接口,如果有失败的则重试,试超过三次还没成功则停止发送

3,请求接口,根据接口的返回日期,比对本地缓存的日期,看有没有过期
决定是从本地读取key,还是从接口请求key。然后再拿着key请求下一个接口

<script setup>import { ref } from "vue";import axios from "axios";const keyValue = ref('');axios.get("http://localhost:8002/getAvailableDate").then(async (res) => {if (new Date() - new Date(res.data.date) < 0) {//没过期const _key = localStorage.getItem('key')keyValue.value = _key} else {//已过期const _key = await axios.get("http://localhost:8002/getNew")keyValue.value = _key.data.key}axios.get("http://localhost:8002/getFinnalDate?key=" + keyValue.value).then((res) => {})})</script>
  1. 对身份证输入进行三次验证,但是其中同异步验证交杂上一个验证通过才开始下一个,不通过就直接报错,前端验证长是否18位-身份证是否占用-前端验证身份证格式是否符合-身份证是否真实

vue与react中的异步
vue中的异步

在页面更新和DOM操作时,vue中的nextTick有大作用

<script setup>import axios from "axios";import { nextTick, ref } from "vue";const videolist = ref([]);// extTick是在DOM更新完成后执行的回调函数。Vue是响应式的,当你更新了videolist(例如videolist.value = res.data.videoList),Vue会标记这个数据为"已改变",并且会异步更新DOM。也就是说,页面更新不会立即发生,而是会在下一个事件循环中进行。所以,如果你直接操作DOM(如获取视频元素并调用play方法),可能会发现这些视频元素还没有更新到页面上。nextTick确保你可以在DOM更新后再执行相关操作。//请求接口-》拿到接口的返回给到videoLsit-》页面根据videoList更新-》更新完成后,获取到所有的videodom-》调用play方法function show() {axios.get("http://localhost:8000/videoList").then((res) => {// 响应式数据更新 页面不会立即跟新videolist.value = res.data.videoList//setTimeout或者nextTick可以立即更新// nextTick(() => {// const videoArr = document.getElementById("container").getElementsByTagName('video');// for (let i = 0; i < videoArr.length; i++) {// videoArr[i].play();// }// })setTimeout(() => {const videoArr = document.getElementById("container").getElementsByTagName('video');for (let i = 0; i < videoArr.length; i++) {videoArr[i].play();}})})}</script><template><button @click="show">加载</button><div id="container" class="container"><div class="video" v-for="video in videolist"><h3>{{ video.name }}</h3><video :src="video.videoSrc" muted></video></div></div></template><script setup>import axios from "axios";import { nextTick, ref } from "vue";//请求接口-》渲染列表-》判断列表长度-》修改是否显示总长度的控制变量const tagList = ref([]);const needShowLength = ref(false);axios.get("http://localhost:8000/tagList").then((res) => {tagList.value = res.data.tagListnextTick(() => {const width = document.getElementById("container").clientWidth;if (width > 800) {needShowLength.value = true;} else {needShowLength.value = false;}})})</script><template><div id="container" class="container"><div class="tag" v-for="item in tagList">{{ item }}</div></div><div v-if="needShowLength">总个数:{{ tagList.length }}</div></template>
react的state修改异步

react中修改state数据是异步的不是马上更新的。所以我们可以看这样例子
一般方案useEffact监听数据改变,如果可以的话改成用useRef,setTimout不行

function App() {// const [name, setName] = useState('')// const [id, setId] = useState('')// const [age, setAge] = useState('')// useEffect(() => {// if (name == '' && age == '' && id == '') {// axios.get(`http://localhost:8000/tagList?name=${name}&age=${age}&id=${id}`)// }// }, [name, age, id]).const name = useRef('');const id = useRef('');const age = useRef('');return (<div className="App">姓名:<input className='input' onChange={(e) => {name.current = e.target.value}}></input>学号:<input className='input' onChange={(e) => {id.current = e.target.value}}></input>年龄:<input className='input' onChange={(e) => {age.current = e.target.value}}></input><button onClick={() => {axios.get(`http://localhost:8000/tagList?name=${name.current}&age=${age.current}&id=${id.current}`)}}>确认</button><button onClick={() => {const inputList = document.getElementsByClassName("input")for (let i = 0; i < inputList.length; i++) {console.log(i);inputList[i].value = ''}name.current = '';id.current = '';age.current = '';axios.get(`http://localhost:8000/tagList?name=${name.current}&age=${age.current}&id=${id.current}`)}}>重置</button></div>);}

文章到这里就结束了 谢谢大家

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

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

相关文章

C++-----函数与库

数学中的函数与编程中的函数对比 数学中的函数 - 数学函数是一种映射关系&#xff0c;例如&#xff0c;函数\(y f(x)x^{2}\)&#xff0c;对于每一个输入值\(x\)&#xff0c;都有唯一确定的输出值\(y\)。它侧重于描述变量之间的数量关系&#xff0c;通常通过公式来表示这种关系…

Loki 微服务模式组件介绍

目录 一、简介 二、架构图 三、组件介绍 Distributor&#xff08;分发器&#xff09; Ingester&#xff08;存储器&#xff09; Querier&#xff08;查询器&#xff09; Query Frontend&#xff08;查询前端&#xff09; Index Gateway&#xff08;索引网关&#xff09…

C++ OpenGL学习笔记(1、Hello World空窗口程序)

终于抽出时间系统学习OpenGL 教程&#xff0c;同时也一步一步记录怎样利用openGL进行加速计算。 目录 1、环境准备1.1、库的下载1.2、库的选择及安装 2、OpenGL第一个项目&#xff0c;Hello World!2.1、新建hello world控制台项目2.2、配置openGL环境2.2.1 包含目录配置2.2.2 …

Linux系统命令基础

Linux命令⾏ [pypylinux ~]$ 普通⽤户py&#xff0c;登陆后 [rootpylinux ~]# 超级⽤户root&#xff0c;登录后root代表当前登录的⽤户 分隔符pylinux 主机名~ 当前的登录的位置&#xff0c;此时是家⽬录# 超级⽤户身份提示符 $ 普通⽤户身份提示符操作系统⽬录分隔符 Linux目录…

不同版本的 Redis 的键值对内存占用情况示例

不同版本的 Redis 的键值对内存占用情况示例 文章目录 不同版本的 Redis 的键值对内存占用情况示例Redis 6.0redisObjectdictEntrysds&#x1f340; 数据结构&#x1f340; sdslen() 函数&#x1f340; sdsReqType() 函数&#x1f340; sdsHdrSize() 函数 内存分配 - malloc() …

实现 WebSocket 接入文心一言

目录 什么是 WebSocket&#xff1f; 为什么需要 WebSocket&#xff1f; HTTP 的局限性 WebSocket 的优势 总结&#xff1a;HTTP 和 WebSocket 的区别 WebSocket 的劣势 WebSocket 常见应用场景 WebSocket 握手过程 WebSocket 事件处理和生命周期 WebSocket 心跳机制 …

2024.7 XAI 遇见 LLM:可解释 AI 与大型语言模型之间关系的调查

https://arxiv.org/pdf/2407.15248 问题 Q1&#xff1a;XAI 技术当前如何与 LLMs 集成&#xff1f;Q2&#xff1a;将 LLMs 与 XAI 方法融合的新兴趋势是什么&#xff1f;Q3&#xff1a;当前相关文献存在哪些差距&#xff0c;哪些领域需要进一步研究&#xff1f; 挑战 LLMs …

RIP实验

要求及分析 路由器上分别配置环回 连接路由器的线路网段为12.1.1.0/24、23.1.1.1.0/24 R1和R3连接的网络地址分别为192.168.1.0/24/192.168.2.0/24 整个网络使用RIP达到全网可达 配置 先配置路由器各接口ip和环回和pc ip网关掩码&#xff08;图略&#xff09; 进行 RI…

Oracle 中间件 Webcenter Portal服务器环境搭建

环境信息 服务器基本信息 如下表&#xff0c;本次安装总共使用2台服务器&#xff0c;具体信息如下&#xff1a; Webcenter1服务器 归类 SOA服务器 Ip Address 172.xx.xx.xx.xx HostName wcc01.xxxxxx.com Alias wccprd01 Webcenter2服务器 归类 OSB服务器 Ip Addr…

macOS 配置 vscode 命令行启动

打开 vscode 使用 cmd shift p 组合快捷键&#xff0c;输入 install 点击 Install ‘code’ command in PATH Ref https://code.visualstudio.com/docs/setup/mac

分层架构 IM 系统之多媒体功能设计与实现

现在 IM 系统已经不仅限于文本消息的通讯了&#xff0c;多媒体数据占据越来越多的比重&#xff0c;比如&#xff1a;文件传输、语音通话、视频通话等。 在前面的文章&#xff08;《基于需求分析模型来结构化剖析 IM 系统》&#xff09;中我们分析过&#xff0c;“多媒体消息”…

0.gitlab ubuntu20.04 部署问题解决

安装依赖&#xff1a; ① sudo apt-get update 出现&#xff1a; 解决方式&#xff1a; 去 /etc/apt/sources.list.d 这个目录删除或注释对应的list文件 第三方软件的源一般都以list文件的方式放在 /etc/apt/sources.list.d 这个目录 重新运行sudo apt-get update 安装…

Next.js v15 - 服务器操作以及调用原理

约定 服务器操作是在服务器上执行的异步函数。它们可以在服务器组件和客户端组件中调用&#xff0c;用于处理 Next.js 应用程序中的表单提交和数据修改。 服务器操作可以通过 React 的 “use server” 指令定义。你可以将该指令放在 async 函数的顶部以将该函数标记为服务器操…

什么是3DEXPERIENCE SOLIDWORKS,它有哪些角色和功能?

将业界领先的 SOLIDWORKS 3D CAD 解决方案连接到基于单一云端产品开发环境 3DEXPERIENCE 平台。您的团队、数据和流程全部连接到一个平台进行高效的协作工作&#xff0c;从而能快速的做出更好的决策。 目 录&#xff1a; ★ 1 什么是3DEXPERIENCE SOLIDWORKS ★ 2 3DEXPERIE…

[Unity]【图形渲染】【游戏开发】Shader数学基础4-更多矢量运算

在计算机图形学和着色器编程中,矢量运算是核心的数学工具之一。矢量用于描述空间中的位置、方向、速度等各种物理量,并在图形变换、光照计算、纹理映射等方面起着至关重要的作用。本篇文章将详细讲解矢量和标量之间的乘法与除法、矢量的加法与减法、矢量的模与单位矢量、点积…

【漏洞复现】CVE-2023-37461 Arbitrary File Writing

漏洞信息 NVD - cve-2023-37461 Metersphere is an opensource testing framework. Files uploaded to Metersphere may define a belongType value with a relative path like ../../../../ which may cause metersphere to attempt to overwrite an existing file in the d…

Bcrypt在线密码加密生成器

具体前往&#xff1a;在线Bcrypt加密工具--使用bcrypt及生成salt的迭代次数强度参数计算生成哈希(摘要)

wxWidgets使用wxStyledTextCtrl(Scintilla编辑器)的正确姿势

开发CuteMySQL/CuteSqlite开源客户端的时候&#xff0c;需要使用Scintilla编辑器&#xff0c;来高亮显示SQL语句&#xff0c;作为C/C领域最成熟稳定又小巧的开源编辑器&#xff0c;Scintilla提供了强大的功能&#xff0c;wxWidgets对Scintilla进行包装后的是控件类&#xff1a;…

构建高性能异步任务引擎:FastAPI + Celery + Redis

在现代应用开发中&#xff0c;异步任务处理是一个常见的需求。无论是数据处理、图像生成&#xff0c;还是复杂的计算任务&#xff0c;异步执行都能显著提升系统的响应速度和吞吐量。今天&#xff0c;我们将通过一个实际项目&#xff0c;探索如何使用 FastAPI、Celery 和 Redis …

【win10+RAGFlow+Ollama】搭建本地大模型助手(教程+源码)

一、RAGFlow简介 RAGFlow是一个基于对文档深入理解的开源RAG&#xff08;Retrieval-augmented Generation&#xff0c;检索增强生成&#xff09;引擎。 主要作用&#xff1a; 让用户创建自有知识库&#xff0c;根据设定的参数对知识库中的文件进行切块处理&#xff0c;用户向大…