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

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

文章目录

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

在这里插入图片描述

前言

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

代码执行顺序的几个关键点

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

接口请求

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

  1. 获取前三用户的积分,做一个图表。但是问题在于,图表x轴的日期,在一个接口。用户列表在一个接口,用户积分又是另外一个接口
    利用async await一步一步就可以实现但是必须请求完上一个请求才能执行下一步代码会影响性能 我们可不可以让没有依赖的请求同时并发从而优化性能并节省时间呢
<script setup>
import * as echarts from "echarts"import { onMounted} from "vue";import axios from "axios";
async function getFinnalData() {//请求最近五天的日期const res = await axios.get("http://localhost:8000/getDate")const dateList = res.data.recentDate;//获取所有用户列表const userRes = await axios.get("http://localhost:8000/getUser")const userList = userRes.data.userList;//按id排序userList.sort((preuser, nowuser) => {return preuser.id - nowuser.id;})//筛选出id前三的userList.splice(3, userList.length - 1);const _seriesArr = []for (let i = 0; i < userList.length; i++) {let _userNumberRes = await axios.get("http://localhost:8000/getUserNumber?id=" + userList[i].id)let _series = {name: _userNumberRes.data.name,data: _userNumberRes.data.recentNumber,type: "line",}_seriesArr.push(_series);}//所有数据都到位了,构建最终的optionslet option = {yAxis: {type: "value"},tooltip: {},xAxis: {type: "category",data: dateList},series: _seriesArr}return option;}
onMounted(() => {getFinnalData()})
</script>

使用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个一组,发送给接口,如果有失败的则重试,试超过三次还没成功则停止发送
<script setup>
import axios from "axios";//循环形成一个100个元素的数组const arr = [];for (let i = 0; i < 100; i++) {arr.push(i);}let tryTime = 0;async function sendSingle(part) {const res = await axios.get("http://localhost:8001/sendData?part=" + part)if (!res.data.success) {tryTime += 1;if (tryTime >= 3) {//重试超过三次还没成功,//就中断后续请求return false} else {return await sendSingle(part);}//请求失败的时候进这里} else {//如果成功了,我们就把重试次数归0tryTime = 0;return true}}async function send() {//每次循环发一组出去for (let j = 0; j < arr.length; j += 10) {const part = arr.slice(j, j + 10);const res = await sendSingle(part);if (!res) {break;}}}send();</script>

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位-身份证是否占用-前端验证身份证格式是否符合-身份证是否真实
<script setup>import axios from "axios";const value = "112301199402313013";const testArr = [(value) => {if (value.length === 18) {return true} else {return false}},async (value) => {//这个写成async或者直接return axios.get()都是可以的const res = await axios.get('http://localhost:8003/isExit?value=' + value);return !res.data.data},(value) => {const reg = /^[1-9]\d{5}(18|19|20|21|22)?\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}(\d|[Xx])$/return reg.test(value)},async (value) => {const res = await axios.get('http://localhost:8003/isReal?value=' + value);return res.data.data}]async function test(value) {for (let i = 0; i < testArr.length; i++) {const res = await testArr[i](value)if (!res) {alert("验证失败")break;}}}test(value)</script>

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>);}

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

相关文章:

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

文章目录 前言代码执行顺序的几个关键点接口请求vue与react中的异步vue中的异步react的state修改异步 前言 本文是B站三十的前端课的笔记前端编程训练,异步编程篇 代码执行顺序的几个关键点 我们可以理解为代码就是一行一行&#xff0c;一句一句是执行&#xff08;定义变量&…...

【kafka03】消息队列与微服务之Kafka 读写数据

Kafka 读写数据 参考文档 Apache Kafka 常见命令 kafka-topics.sh #消息的管理命令 kafka-console-producer.sh #生产者的模拟命令 kafka-console-consumer.sh #消费者的模拟命令 创建 Topic 创建topic名为 chen&#xff0c;partitions(分区)为3&#xff0…...

【分布式系统】唯一性ID的实现

1、UUID&#xff08;通用唯一标识符&#xff09; 1、UUID本身 一种用于标识信息的标准化方法。一个128位的数字&#xff0c;常表示为32个十六进制数字&#xff0c;以连字符分隔成五组&#xff1a;8-4-4-4-12。 版本&#xff1a; UUID有不同的版本&#xff0c;最常见的是基于时…...

哪里能找到好用的动物视频素材 优质网站推荐

想让你的短视频增添些活泼生动的动物元素&#xff1f;无论是搞笑的宠物瞬间&#xff0c;还是野外猛兽的雄姿&#xff0c;这些素材都能让视频更具吸引力。今天就为大家推荐几个超实用的动物视频素材网站&#xff0c;不论你是短视频新手还是老手&#xff0c;都能在这些网站找到心…...

SRAM芯片数据采集解决方案

SRAM芯片数据采集解决方案致力于提供一种高效、稳定且易于操作的方法&#xff0c;以确保从静态随机存取存储器SRAM芯片中准确无误地获取数据。 这种解决方案通常包括硬件接口和软件工具&#xff0c;它们协同工作&#xff0c;以实现对SRAM芯片的无缝访问和数据传输。 在硬件方…...

【贪心算法第七弹——674.最长连续递增序列(easy)】

目录 1.题目解析 题目来源 测试用例 2.算法原理 3.实战代码 代码分析 1.题目解析 题目来源 674.最长递增子序列——力扣 测试用例 2.算法原理 贪心思路 3.实战代码 class Solution { public:int findLengthOfLCIS(vector<int>& nums) {int n nums.size();in…...

[AI] 知之AI推出3D智能宠物:助力语言学习与口语提升的新选择

Hello! 知之AI官网 [AI] 知之AI推出3D智能宠物&#xff1a;助力语言学习与口语提升的新选择 随着人工智能技术的飞速发展&#xff0c;虚拟助手和智能设备不断进入我们的生活。近日&#xff0c;知之AI重磅推出了一款创新产品——3D智能宠物。这一产品不仅具备多国语言交流能力&…...

Android 14之HIDL转AIDL通信

Android 14之HIDL转AIDL通信 1、interface接口1.1 接口变更1.2 生成hidl2aidl工具1.3 执行hidl2aidl指令1.4 修改aidl的Android.bp文件1.5 创建路径1.6 拷贝生成的aidl到1和current1.7 更新与冻结版本1.8 编译模块接口 2、服务端代码适配hal代码修改2.1 修改Android.bp的hidl依…...

【R库包安装】R库包安装总结:conda、CRAN等

【R库包安装】R studio 安装rgdal库/BPST库 R studio 安装rgdal库解决方法 R studio 安装BPST库&#xff08;github&#xff09;解决方法方法1&#xff1a;使用devtools安装方法2&#xff1a;下载安装包直接在Rstudio中安装 参考 基础 R 库包的安装可参见另一博客-【R库包安装】…...

学习PMC要不要去培训班?

在当今快速变化的商业环境中&#xff0c;PMC作为供应链管理的核心环节之一&#xff0c;其重要性日益凸显。PMC不仅关乎产品的物料计划、采购、库存控制及物流协调&#xff0c;还直接影响到企业的生产效率、成本控制以及市场竞争力。面对这一专业领域的学习需求&#xff0c;许多…...

前端 用js封装部分数据结构

文章目录 Stack队列链表Setset 用来数组去重set用来取两个数组的并集set用来取两个数组的交集set用来取两个数组的差集 字典 Stack 栈&#xff0c;先进后出&#xff0c;后进先出。用数组来进行模拟&#xff0c;通过push存入&#xff0c;通过pop取出。 class Stack {// 带#表示…...

cocoscreator-doc-TS:目录

cocoscreator-doc-TS-脚本开发-访问节点和组件-CSDN博客 cocoscreator-doc-TS-常用节点和组件接口-CSDN博客 cocoscreator-doc-TS-脚本开发-创建和销毁节点-CSDN博客 cocoscreator-doc-TS-脚本开发-加载和切换场景-CSDN博客 cocoscreator-doc-TS-脚本开发-获取和设置资源-CS…...

理解Java集合的基本用法—Collection:List、Set 和 Queue,Map

本博文部分参考 博客 &#xff0c;强烈推荐这篇博客&#xff0c;写得超级全面&#xff01;&#xff01;&#xff01; 图片来源 Java 集合框架 主要包括两种类型的容器&#xff0c;一种是集合&#xff08;Collection&#xff09;&#xff0c;存储一个元素集合&#xff08;单列…...

IOC容器实现分层解耦

文章开始之前&#xff0c;先引入软件开发的两个名词&#xff1a;耦合和内聚。耦合是指&#xff1a;衡量软件中各个层&#xff08;三层架构&#xff09;/各个模块的依赖关联程度&#xff1b;内聚是指&#xff1a;软件中各个功能模块内部的功能联系。三层架构中Controller、Servi…...

Flutter 共性元素动画

在 Flutter 中&#xff0c;共性元素动画&#xff08;Shared Element Transitions&#xff09;用于在页面导航或组件切换时创建视觉上更流畅和连贯的动画效果。这种动画可以使用户感受到两个界面之间的“物理联系”&#xff0c;比如图片从缩略图到全屏的扩大效果。 前置知识点整…...

K8s内存溢出问题剖析:排查与解决方案

文章目录 一、背景二、排查方案&#xff1a;1. 可能是数据量超出了限制的大小&#xff0c;检查数据目录大小2. 查看是否是内存溢出2.1 排查数据量&#xff08;查看数据目录大小是否超过limit限制&#xff09;2.2 查看pod详情发现问题 三、解决过程 一、背景 做redis压测过程中…...

乌班图单机(不访问外网)部署docker和服务的方法

面向对象:Ubuntu不能访问外网的机子,部署mysql、redis、jdk8、minio 过程: 1、安装docker(照着图去这里找对应的下载下来https://download.docker.com/linux/static/stable/),将7个docker官网下载的文件下载下来后,传上去服务器随便一个文件夹或者常用的opt或者/usr/lo…...

使用 pycharm 新建使用 conda 虚拟 python 环境的工程

1. conda 常见命令复习&#xff1a; conda env list // 查看 conda 环境列表 conda activate xxxenv // 进入指定 conda 环境2. 环境展示&#xff1a; 2.1. 我的物理环境的 Python 版本为 3.10.9&#xff1a; 2.2. 我的 conda 虚拟环境 env_yolov9_python_3_8 中的 pyth…...

Docker的save和export命令的区别,load和import的区别 笔记241124

Docker的save和export命令的区别,load和import的区别 解说1: Docker的save和export命令&#xff0c;以及load和import命令&#xff0c;在功能和使用场景上存在显著的区别。以下是对这两组命令的详细对比和解释&#xff1a; Docker save和export命令的区别 使用方式和目的&am…...

通俗理解人工智能、机器学习和深度学习的关系

最近几年人工智能成为极其热门的概念和话题&#xff0c;可以说彻底出圈了。但人工智能的概念在1955年就提出来了&#xff0c;可以说非常古老。我在上小学的时候《科学》课本上就有人工智能的概念介绍&#xff0c;至今还有印象&#xff0c;但那些年AI正处于“寒冬”&#xff0c;…...

使用 pycharm 新建不使用 python 虚拟环境( venv、conda )的工程

有时候我们发现一个好玩的 demo&#xff0c;想赶快在电脑上 pip install 一下跑起来&#xff0c;发现因为 python 的 venv、conda 环境还挺费劲的&#xff0c;因为随着时间的发展&#xff0c;之前记得很清楚的 venv、conda 的用法&#xff0c;不经常使用&#xff0c;半天跑不起…...

【大数据学习 | Spark-SQL】SparkSQL读写数据

我们使用sparksql进行编程&#xff0c;编程的过程我们需要创建dataframe对象&#xff0c;这个对象的创建方式我们是先创建RDD然后再转换rdd变成为DataFrame对象。 但是sparksql给大家提供了多种便捷读取数据的方式。 //原始读取数据方式 sc.textFile().toRDD sqlSc.createDat…...

AI赋能公共服务转型升级 | 第十届中国行业互联网大会暨腾讯云TVP行业大使三周年庆典公共服务专场圆满举办!

引言 党的二十大报告把“基本公共服务实现均等化”作为 2035 年我国发展的总体目标之一&#xff0c;强调要“健全基本公共服务体系&#xff0c;提高公共服务水平”。AI 作为新质生产力的核心驱动力之一&#xff0c;正在公共服务领域发挥着越来越重要的作用。 2024 年 10 月 2…...

关于按天切割Tomcat的catalina.out日志文件的配置

1、catalina.out 是 Tomcat 的标准输出和标准错误日志&#xff0c;通常输出到 Tomcat 安装目录下的 logs 文件夹中。这个日志文件会记录 Tomcat 启动、停止以及运行过程中产生的所有日志信息。 2、在Apache Tomcat中&#xff0c;日志文件catalina.out默认情况下不会自动按天切割…...

【人工智能】深入解析GPT、BERT与Transformer模型|从原理到应用的完整教程

在当今人工智能迅猛发展的时代&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域涌现出许多强大的模型&#xff0c;其中GPT、BERT与Transformer无疑是最受关注的三大巨头。这些模型不仅在学术界引起了广泛讨论&#xff0c;也在工业界得到了广泛应用。那么&#xff0c;G…...

彻底理解如何保证ElasticSearch和数据库数据一致性问题

一.业务场景举例 需求&#xff1a; 一个卖房业务&#xff0c;双十一前一天&#xff0c;维护楼盘的运营人员突然接到合作开发商的通知&#xff0c;需要上线一批热门的楼盘列表&#xff0c;上传完成后&#xff0c;C端小程序支持按楼盘的名称、户型、面积等产品属性全模糊搜索热门…...

2024-2025热门留学趋势

在信息爆炸的时代&#xff0c;留学已成为许多人规划未来、拓宽视野的重要途径。随着全球教育格局的不断变化&#xff0c;留学领域也涌现出一系列新热点和趋势。本文将为您解读2024年最热门的留学话题&#xff0c;并提供实用的准备策略&#xff0c;助您在留学之路上一帆风顺。 热…...

寻找视频特效素材的优质网站推荐 轻松提升作品魅力

在短视频、影视和广告制作中&#xff0c;视频特效素材已成为提升作品专业感的关键元素。炫酷的光效、震撼的爆炸、动感的粒子效果和流畅的转场特效&#xff0c;都能让作品更具吸引力。那么&#xff0c;视频特效素材去哪里找呢&#xff1f;今天&#xff0c;小编为大家精心挑选了…...

【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-36

文件下载与邀请翻译者 学习英特尔开发手册&#xff0c;最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。 讲解下载英特尔开发手册的文章 翻译英特尔开发手册&#xff0c;会是一件耗时费力的工作。如果有愿意和我一起来做这件事的&#xff0c;那么&#xff…...

信息安全实验--密码学实验工具:CrypTool

1. CrypTool介绍&#x1f4ad; CrypTool 1的开源教育工具&#xff0c;用于密码学研究。通过CrypTool 1&#xff0c;可以实现加密和解密操作&#xff0c;数字签名。CrypTool1和2有很多区别的。 2. CrpyTool下载&#x1f527; 在做信息安全实验--密码学相关实验时&#xff0c;发…...

wordpress图片属性添加图片/seo优化技术培训中心

在学习linux内核源码kfifo队列之际&#xff0c;自己用C模板简单写了一个类似的队列&#xff0c;如下&#xff1a; 对linux内核的kfifo队列讲解详细可参考&#xff1a;Linux内核数据结构kfifo详解 #ifndef MFIFO_H #define MFIFO_H#include <iostream>using namespace s…...

阜宁做网站的公司/小红书怎么做关键词排名优化

当你打开任何一个朋友的微信朋友圈&#xff0c;首先映入眼帘的是什么呢?你可能会说是他的头像&#xff0c;但其实最吸睛的除了头像之外还有朋友圈的背景图。这块地方比头像的位置更为宽大&#xff0c;我们在这里可以充分发挥自己的想象力设计出适合自己的非常具有吸引力的朋友…...

外贸订单网站有哪些/百度人工客服

前言: 在讲解Kafka的架构前我们先了解一下什么是消息队列 1. 消息队列的讲解 消息: 应用之间的信息相互传递 消息队列(Message Queue): 将消息放在队列中保证消息可靠传递 1.1 消息队列的特点 应用系统之间解耦----12306–用户系统后台消息驱动&#xff1a;以消息驱动应用…...

青海建设厅通报网站/seo提升关键词排名

作者简介李剑&#xff0c;携程系统研发部技术专家&#xff0c;负责Redis和Mongodb的容器化和服务化工作&#xff0c;喜欢深入分析系统疑难杂症。前言随着携程的应用大规模在生产上用容器部署&#xff0c;各种上规模的问题都慢慢浮现&#xff0c;其中比较难定位和解决的就是偶发…...

中国人民共和国住房和城乡建设部网站/广东疫情最新消息今天又封了

欢迎关注微信公众号&#xff1a; JueCode VasSonic是腾讯开源的一套完整的Hybrid方案&#xff0c;Github地址: VasSonic,官方定义是一套轻量级和高性能的Hybrid框架&#xff0c;专注于提升H5首屏加载速度。今天主要分享下其中的一个技术&#xff0c;并行加载技术。在开始之前先…...

同一人可以做几个网站的负责人/百度seo和sem的区别

一、备份单个数据库1、备份命令&#xff1a;mysqldumpMySQL数据库自带的一个很好用的备份命令。是逻辑备份&#xff0c;导出 的是SQL语句。也就是把数据从MySQL库中以逻辑的SQL语句的形式直接输出或生成备份的文件的过程。单实例语法(Syntax):mysqldump -u -p > /path/to/**…...