Vue.js 中使用 axios 遍历两个数组的问题及解决方案

简介: axios异步调用两个方法并把两个方法同时遍历到页面中第一个方法:调用出bookid,装到bArray数组中第二个方法:根据第一个方法调用出来的所有bookid依次调用对应的title(书名),并把所有书名依次装入bArray数组中。

项目场景:


axios异步调用两个方法并把两个方法同时遍历到页面中


第一个方法:调用出bookid,装到bArray数组中


第二个方法:根据第一个方法调用出来的所有bookid依次调用对应的title(书名),并把所有书名依次装入bArray数组中。



问题描述


问题:使用完两个axios无法实现显示bArray数组中的书名。


query:function(){
            let bArray=[]
            axios.get(`queryBorrowSno?sno=${this.sno}`).then(res=>{
                bArray=res.data
                for(let i=0;i<bArray.length;i++)
                {
                    this.bookid=bArray[i].bookid
                    axios.get(`queryBookId?bookid=${this.bookid}`).then(com=>{
                    bArray[i].title=com.data.title
                    console.log(JSON.stringify(bArray)+"第"+i+"次")
                    this.asno=bArray.studentid
                    console.log(this.bookName)
                    this.bArray=bArray
                })
                }
            })
        },



原因分析:


在代码中,因为第二个 axios 请求是异步的,所以它的回调函数会在 for 循环结束后执行。这意味着当你给 bArray 赋值时,只有最后一次循环的数据被赋值到了 bArray[i].title 上,而之前的数据都没有被处理。


要解决这个问题,可以使用 Promise 链式调用等待第二个请求完成后再进行下一步操作。


解决方案:

query: function () {
            // 调用方法实现bookid的获取
            axios.get(`queryBorrowSno?sno=${this.sno}`).then(res => {
                // 定义常量等于事件数组
                const bArray = res.data;
                // 定义request空数组
                let requests = [];
                for (let i = 0; i < bArray.length; i++) {
                    // 记录每个异步请求对象
                    // 把bArray数组的bookid调用的值都push进去装进request数组里
                    requests.push(
                        axios.get(`queryBookId?bookid=${bArray[i].bookid}`).then(com => {
                            bArray[i].title = com.data.title;
                        })
                    );
                }
                // 等待所有异步请求完成
                Promise.all(requests).then(() => {
                    this.bArray = bArray;
                    console.log(JSON.stringify(this.bArray));
                });
            });
        },


在上述代码中,我们首先发起第一个请求,并将返回的数据存储在本地变量 bArray 中。然后使用 for 循环遍历 bArray,并将每个异步请求对象添加到数组 requests 中。在循环结束后,使用 Promise.all() 方法等待所有异步请求对象完成,再将处理后的 bArray 数据赋值给组件 data 中的变量 this.bArray,以显示在页面中。


需要注意的是,使用 Promise 链式调用时需要正确处理错误和异步顺序。



相关文章
|
3天前
|
存储 JavaScript 索引
js开发:请解释什么是ES6的Map和Set,以及它们与普通对象和数组的区别。
ES6引入了Map和Set数据结构。Map的键可以是任意类型且有序,与对象的字符串或符号键不同;Set存储唯一值,无重复。两者皆可迭代,支持for...of循环。Map有get、set、has、delete等方法,Set有add、delete、has方法。示例展示了Map和Set的基本操作。
23 3
|
3天前
|
开发框架 前端开发 JavaScript
C# 6.0+JavaScript云LIS系统源码  云LIS实验室信息管理新型解决方案
云LIS是为区域医疗提供临床实验室信息服务的计算机应用程序,可协助区域内所有临床实验室相互协调并完成日常检验工作,对区域内的检验数据进行集中管理和共享,通过对质量控制的管理,最终实现区域内检验结果互认。其目标是以医疗服务机构为主体,以医疗资源和检验信息共享为目标,集成共性技术及医疗服务关键技术,建立区域协同检验,最大化利用有限的医疗卫生资源。
104 1
|
1天前
|
移动开发 JavaScript 前端开发
Web Worker:JavaScript的后台任务解决方案
Web Worker:JavaScript的后台任务解决方案
|
1天前
|
前端开发 JavaScript API
Howler.js:音频处理的轻量级解决方案
Howler.js:音频处理的轻量级解决方案
|
3天前
|
JavaScript
通过使用online表单的获取使用,了解vue.js数组的常用操作
通过使用online表单的获取使用,了解vue.js数组的常用操作
|
3天前
|
存储 JavaScript 前端开发
深入了解JavaScript中的indexOf()方法:实现数组元素的搜索和索引获取
深入了解JavaScript中的indexOf()方法:实现数组元素的搜索和索引获取
9 0
|
3天前
|
JavaScript
vue项目切换页面白屏的解决方案
vue项目切换页面白屏的解决方案
10 0
|
3天前
|
JavaScript 前端开发
js关于数组的方法
js关于数组的方法
11 0
|
3天前
|
JavaScript 前端开发
js怎么清空数组?
js怎么清空数组?
14 0
|
3天前
|
JavaScript 前端开发 API
vue改变数组页面重新渲染的操作/那些操作不会重新渲染页面以及解决方法
vue改变数组页面重新渲染的操作/那些操作不会重新渲染页面以及解决方法
16 2