[Vue]8. 循环里带有异步的多种写法分析

异步循环和双层嵌套循环(性能优化nodejs从2.8m到28s) 两步优化: 定位问题:该接口使用多次sql查询,并采用了async,另外在数据的处理中使用了map,forEach嵌套。 方案: 1/使用了bluebird来异步并发请求,替代原来的async请求。 2/数据处理确实无法减少嵌套,我采用了for循环来替代map,forEach,虽然降低了代码的可读性,但是这里因为数据量比较大,两层循环的原因,确实能有效节约时间。 优化前: 优化后: ... 阅读详情

1.预备工作:

首先定义getData()函数,请求后台的数据(随机卡1~4秒后返回),这个request是axios封装,返回一个Promise变量

由于有axios,这个函数显然是异步的,其实也不用管,只要知道这个是异步请求函数就行了

import request from '@/utils/request'
export function getData(x) {
    
    const data = {
       x:x
    }
    return request({
      url: '/getData',
      method: 'post',
      data: data,
    })
}

然后我们的xxx.vue是这样的,点击按钮触发f1(),逻辑容易理解

<template>
  <div class="test">
      <el-button  @click="f1()">获取数据</el-button>
  </div>
</template>

<script>
import {getData} from '@/api/testData' //引入外部的getData函数,灵活处理

export default{
    data(){
        return {
            token:getToken(),
            Data1:{}
        }
    }
    methods:{
       f1(){
         //循环多次调用getData(x)
       }      
    }
}

 

正式开始,我们循环里调用getData()

 

2.1第一种写法,第一直觉写法

f1(){
//方法1
  var dd=[]
  for(let i=0;i<5;i++){
      var res=getData(i)
      let res1=JSON.stringify(res.data.ans)//对象转为json
      console.log("res:"+res1)
      dd.push(res1)
  }
  console.log("dd"+dd)
}

输出:

输出循环里并没有得到数据,原因是getData(i)是异步请求,相当于走分叉了,getData()没处理完就console.log输出了

 

2.2第二种写法   使得循环里输出有数据

由于我们的getData异步返回的是Promise变量,可以加then确保访问后才执行.then后的逻辑

f1(){
//方法2
  var dd=[]
  for(let i=0;i<5;i++){
      getData(i).then((res)=>{
        let res1=JSON.stringify(res.data.ans)//对象转为json
        dd.push(res1)
        console.log("ddli:"+dd)
      })
  }
  console.log("ddwai:"+dd)
}

输出:

分析:

里层的dd有数据了,乱序是因为返回的时间不同,先返回的先push进去了

我们外层的dd没有数据,那是因为输出语句比getData()的循环先执行了

 

2.3 第三种写法   外层输出也有数据,也就是说等整个循环结束后才往下走

async f1(){
       var dd=[]
       ! await function f2(){
            return new Promise(resolve=>{

                    var cnt=0;
                    for(let i=0;i<5;i++){
                        getData(i).then((res)=>{
                            let res1=JSON.stringify(res.data.ans)//对象转为str
                            dd.push(res1)
                            console.log("ddli:"+dd)
                            cnt++;
                            if(cnt==5)resolve()
                        })
                    }
                    
             })
       }()
       console.log("ddwai:"+dd)
}

输出:

分析:首先我们使用async 与await

async 函数(){}  :声明函数里含有异步

await  表达式    等待表达式/包括函数,完成后才往下走,这里我们配合Promise来使用

那么我们的写法就是

 await 函数()
 { 
    返回一个Promise对象 
    return new Promise(
        resolve=>{
            异步函数().then(
                (异步函数返回的结果)=>{
                    if(满足条件){
                        resolve()结束Promise
                    }
                }
            )
            
        }
    )
 }

!function f2(){}()
等价于  
function f2(){}
f2()

在Promise对象里 当if(满足条件){ resolve(); }来结束Promise 往下走

在这里我们的满足条件就是5个getData()全部完成,因此我们加一个计数器cnt来记录

 

 

2.4第四种写法 外层输出有数据,且返回依次按顺序执行(使用递归)

async f1(){
       var dd=[]
       ! await function f2(){
            return new Promise(resolve=>{

                var x=0;
                dfs(x)
                function dfs(x){ //递归
                    getData(x).then((res)=>{
                        let res1=JSON.stringify(res.data.ans)//对象转为json
                        dd.push(res1)
                        console.log("ddli:"+dd)
                        x++;
                        if(x<5){
                            dfs(x)
                        }else{
                            resolve()//递归完成,返回Promise.resolve
                        }
                    })
                }
                    
             })
       }()
       await console.log("ddwai:"+dd)
}

输出:

不仅会按顺序依次返回(解决有依赖的情况),而且外层也有值了

 

 

 

 

 

forEachr循环实现异步生成多个echarts图表 forEachr循环实现异步生成多个echarts图表 需求: 需要循环数组发起多个请求,生成多个echarts图表 数据量过大,前端缓存查询结果保持1分钟 本人使用的是vue框架,但是是创建一个id document.getElementById() 方式获取dom结构 循环动态生成id JS里异步获取图表数据,循环获取每个dom的id,然后动态渲染每个图表 上图使用 this.$nextTick是为了解决在图表元素并未加载的情况下进行eharts.init(),会报错 Cannot read p 阅读详情

相关推荐

Redis Lua引擎UAF漏洞CVE-2025-49844深度剖析与复现实践

内存安全是软件系统稳定性的基石,其核心原理在于确保程序对内存的访问始终处于合法、受控的状态。在C/C++等手动管理内存的语言中,Use-After-Free(释放后使用)是一种典型的高危内存安全漏洞,它源于已释放的内存区域仍被程序指针引用,导致数据混乱或程序崩溃。这类漏洞的技术价值在于其往往能突破高级语言的安全边界,直接威胁进程本身,危害等级极高,常见于数据库、浏览器等核心基础设施。在Redis这样的高性能内存数据库中,其内置的Lua脚本引擎为复杂操作提供了强大支持,但同时也引入了沙箱环境下的复杂内存对象生

weixin_42530732的博客 365

浅谈JavaScript事件循环与Vue的批量异步更新策略

javaScript 事件循环 vue批量异步更新策略

趟过java,遇见web 551

UE5 Compute Shader实战:从基础到高级应用全解析

本文全面解析了在UE5中应用Compute Shader的完整流程,从基础概念、环境搭建到核心机制与实战应用。详细介绍了如何通过参数传递、线程派遣与数据读写实现GPU并行计算,并深入探讨了GPU粒子模拟、性能优化及结合光线追踪等高级应用场景,为开发者掌握UE5高性能计算提供系统指导。

yhn45678901的博客 500

vue.js中for循环实现异步方法同步执行

前言:在项目中有些逻辑或者请求依赖另一个异步请求,常用的方法是回调函数、async await 。场景:For循环中异步接口查询返回数据 知识点:async 是“异步”的简写,async 用于申明一个 function 是异步的,而 await 用于等待一个异步方法执行完成,并且await 只能出现在 async 函数中,否则会报错。async作用:当调用一个 async 函数时,会返回一个 Promise 对象。当这个 async 函数返回一个值时,Promise 的 resolve 方法会负责传递

lemon今天学习了吗?的博客 8445

Xcelium XRUN实用指南:从入门到高效仿真

本文是Xcelium XRUN仿真工具的实用指南,从基础入门到高效应用全面解析。XRUN作为Cadence Xcelium的统一命令行入口,能自动化编译、精细和仿真流程,大幅提升数字芯片与FPGA验证效率。文章详细介绍了最简命令、波形调试、增量编译、多核并行仿真等核心功能,并提供了管理复杂项目、性能调优与深度调试的进阶技巧,帮助工程师快速上手并精通这一高效仿真工具。

weixin_29238147的博客 740

Gemini 3.1 Flash本地部署实操:Ollama+Open WebUI零门槛运行指南

大型语言模型(LLM)本地运行是指将模型权重下载至本地设备,通过推理引擎完成离线推理的过程;其核心原理依赖量化压缩(如GGUF格式)与轻量级运行时(如Ollama)实现CPU/GPU高效加载;技术价值在于低延迟响应、数据隐私可控及免网络依赖;典型应用场景包括办公提效(邮件/周报生成)、学生学习辅助、产品原型验证等边缘AI任务;本文聚焦Gemini 3.1 Flash这一面向消费级硬件优化的轻量模型变体,结合Ollama模型管理与Open WebUI图形界面,提供从环境准备、模型拉取到流式对话的完整新手实操路

weixin_32238157的博客 494

vue 里 for循环中有异步操作导致数据错乱的问题

经常会遇到for循环里有异步操作, 然后数据不对就会很头大 Func () { let tempArr = [] for (let i = 0; i < 10; i++) { if (i % 2 == 0) { tempArr.push(i + 10) } else { // setTimeout 模拟遇到的异步操作 setTimeout(() => { tempArr.push(i) }, 1)

良人非良 3075

利用autojs制作抢购支付宝消费劵的手机脚本

前期准备工作 1.打开支付宝,点击中间的抢消费券的广告 2.点击左上角,将抢购页面添加到首页 3.查看支付宝首页是否出现消费劵 . autojs代码 "auto"; functiontaskstart(){ sleep(1000); launchApp('支付宝'); toast("正在打开支付宝应用"); sleep(1000); varxf=textContains("消费").findOne().bounds(); ...

洛阳泰山的博客 1万+

【vue中循环调用异步方法】在Vue循环中调用异步方法,并在调用结束后才开始下一步循环的方法。

【vue中循环调用异步方法】在Vue循环中调用异步方法,并在调用结束后才开始下一步循环的方法。

冬瓜的博客 2048

Java调用OpenDDS(2)-理解OpenDDS自带的Messager示例

理解Messenger

zhangzl419 1660

【2025CSPJ普及组】T4. 多边形

【2025CSPJ普及组】T4. 多边形【题目描述】小 R 喜欢玩小木棍。小 R 有 n 根小木棍,第i(1≤i≤n) 根小木棍的长度为 ai。

lybc2019的博客 849

vue环境------for循环里面请求接口,遇到的异步问题(请求接口前的 i 与接口请求后的 i 不一致)

问题描述:如下面代码,arr[i]的是前后不一致 var arr=[{age:10},{age:20}] for (var i in arr){ //lenth=2,循环两次 console.log(arr[i]) //{age:10},{age:20} sgtbService_sgtbcx(arr[i].age).then(res=>{ console.log(arr[i]) /...

string佳佳的博客 4981

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

coderwhy-vue学习

(新)2019Vue、Vuejs最详细教程-入门到项目实战 一、邂逅Vuejs 1、认识Vuejs 1.1 简单认识一下Vuejs Vue (读音 /vjuː/,类似于 view),不要读错。 Vue是一个渐进式的框架,什么是渐进式的呢? 渐进式意味着你可以将Vue作为你应用的一部分嵌入其中,带来更丰富的交互体验。 或者如果你希望将更多的业务逻辑使用Vue实现,那么Vue的核心库以及其生态系统...

xieanna123的博客 8485

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

vue批量异步更新策略源码解析

一、事件循环、宏任务、微任务 1.事件循环Event Loop:浏览器为了协调事件处理、脚本执行、网络请求和渲染等任务而定制的工作机制。 2.宏任务Task: 代表一个个离散的、独立的工作单位。浏览器完成一个宏任务,在下一个宏任务开始执行之前,会对页面重新渲染。主要包括创建文档对象、解析HTML、执行主线JS代码以及各种事件如页面加载、输入、网络事件和定时器等。 3.微任务:微任务是更小的任务,是在当前宏任务执行结束后立即执行的任务。如果存在微任务,浏览器会在完成微任务之后再重新渲染。微任务的例子有P

MiemieWan的博客 1225

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Vue 异步更新队列

Vue.js 的异步更新队列是一个核心概念,用于优化应用程序的性能。在 Vue 中,当状态(数据)发生变化时,Vue 并不会立即更新 DOM(文档对象模型)。相反,它会把所有在同一个事件循环中发生的状态改变收集起来,放到一个队列中,然后在一个适当的时机一次性地更新 DOM。

大剑师兰特的GIS世界 1291

Vue中的异步更新是如何实的?

在下一个事件循环周期中,Vue会批量地处理队列中的变化,以提高性能。这种机制保证了数据变化的响应是异步的,而不会立即更新DOM,从而避免了频繁的重绘操作。在Vue中,当数据发生变化时,Vue会异步地更新DOM,这是Vue响应式系统的核心。这正是Vue中异步更新的表现,通过事件循环和虚拟DOM的优化,Vue可以高效地处理数据更新并更新DOM。总的来说,Vue中的异步更新是通过利用JavaScript事件循环机制和虚拟DOM技术来实现的,这一机制保证了数据变化的响应是异步的,从而提高了性能和用户体验。

有我更精彩的博客 698

Vuejs

1. 入门案例 创建vuejs-demo.html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>快速入门</title> </head> <body> <!-- 第三步:定义视图,确定渲染的开...

xiaomu_a的博客 595

VueJS入门使用

简单使用 导入vue.js依赖文件 <script src="/js/vue.js"></script> VueJS对象的结构 语法格式 <body> <!-- 正确写法{{数据键名}} --> <!-- 会在Vue()中的data里取 --> {{param1}} --> test1 {{par...

Oscrazy的博客 531

理解Vue.nextTick使用及源码分析(微任务的妙用)

异步更新机制使用微任务或宏任务,基于事件循环运行,在 Vue 中对性能起着至关重要的作用,它对重复冗余的 watcher 进行过滤。 而 nextTick 根据不同的环境,使用优先级最高的异步任务。这样做的好处是等待所有的状态同步更新完毕后,再一次性渲染页面。 用户创建的 nextTick 运行页面更新之后,因此能够获取更新后的DOM。

陈坚泓的博客 6500

vue使用v-for渲染数据,并把的数据作为参数,调用methods方法进行新的异步操作,获取新数据

问题 通过ajax获取mv列表到数组中,然后通过v-for渲染到页面上。此时,想要通过每次渲染时得到mv的id作为参数,传入一个函数中进行新的异步操作,但是遇到了问题。 <div class="card" v-for="(mv,index) in recommendMVs" :key="index"> <div id="mv"> <img :src="mv.picUrl" > <div id="info

liangyk1005的博客 5787

vue 任务队列和异步更新策略 (清晰理解任务队列、微任务、宏任务)

事件循环 JavaScript 语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。为了协调事件、用户交互、脚本、UI 渲染和网络处理等行为,防止主线程的不阻塞,Event Loop 的方案应用而生。Event Loop 包含两类:一类是基于 Browsing Context,一种是基于 Worker。二者的运行是独立的,也就是说,每一个 JavaScript 运行的"线程环境"都有一个独立的 Event Loop,每一个 Web Worker 也有一个独立的 Event Loop。 任务队列

June.1 1万+

Vue学习笔记集--异步更新

在 Vue.js 中,是框架优化性能的核心设计之一,它确保数据变化后不会立即触发 DOM 更新,而是将多个数据变更合并到一次更新中,避免不必要的重复渲染。setternextTicknextTicksetTimeoutqueueJob当数据变化后需要立即操作更新后的 DOM 时,需使用或updated使用或组件内的。

Three_stones的博客 806

vue 异步渲染的dom处理

原文链接: vue 异步渲染的dom处理 上一篇: ...

阿豪 344

js异步等待完成后再进行下一步操作_Vue 之异步更新机制和nextTick原理

阅读本文约需要8分钟大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈)。上次老师跟大家分享了JS 之函数式编程术语总结的知识,今天跟大家分享下Vue 之异步更新机制和nextTick原理的知识。1Vue 之异步更新机制和nextTick原理参考文献:https ://www.cnblogs.com/chanwahfung/p/13296...

weixin_39879674的博客 2540

Vue详解+实战分析

文章目录备注一、Vue简介简介MVVM--双向数据绑定模式其他MVVM实践者为什么使用Vue.js两大核心要素二、Vue开发引入Vue快速体验注释1.插值表达式 {{}}注释2.分支 v-if注释3.分支 v-show注释 备注 网上的书籍以及官方文档已经把资料总结的很详细了,这里我不再罗列成体系的理论知识,而是重点记录如何将Vue的各个功能应用到我们所写的的代码上,以及重难点、易错部分的分析。 一、Vue简介 简介 渐进式js框架,只关心视图层,就是MVC中的View视图层,使用Vue需要先熟练掌握

super_song的博客 3908
上一篇: [Vue] 7. 使用axios调用后端接口 (跨域问题解决+415错误解决)
下一篇: [Vue] 9. vue-amap高德地图初体验
animalcoder
博客等级 码龄9年 43粉丝 150原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值