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

项目场景:

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 链式调用时需要正确处理错误和异步顺序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃巧克li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值