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



相关文章
|
2月前
|
JavaScript
在 Vue 中处理组件选项与 Mixin 选项冲突的详细解决方案
【10月更文挑战第18天】通过以上的分析和探讨,相信你对在 Vue 中使用 Mixin 时遇到组件选项与 Mixin 选项冲突的解决方法有了更深入的理解。在实际开发中,要根据具体情况灵活选择合适的解决方案,以确保代码的质量和可维护性。
93 7
|
2月前
|
JavaScript 前端开发
JS浮点数精度问题及高精度小数运算:BigNumber解决方案
JS浮点数精度问题及高精度小数运算:BigNumber解决方案
153 0
|
2月前
|
资源调度 JavaScript
|
2月前
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
686 1
|
2月前
|
缓存 JavaScript 搜索推荐
|
23天前
|
前端开发 JavaScript 开发者
除了 Generator 函数,还有哪些 JavaScript 异步编程解决方案?
【10月更文挑战第30天】开发者可以根据具体的项目情况选择合适的方式来处理异步操作,以实现高效、可读和易于维护的代码。
|
2月前
|
前端开发 JavaScript 安全
在vue前端开发中基于refreshToken和axios拦截器实现token的无感刷新
在vue前端开发中基于refreshToken和axios拦截器实现token的无感刷新
108 4
|
2月前
|
自然语言处理 前端开发 JavaScript
🛠️ JavaScript数组操作指南:20个精通必备技巧🚀
本文详细介绍了 JavaScript 中的 20 个高效数组操作技巧,涵盖了从基本的添加、移除元素,到数组转换和去重等高级操作。强调了不可变性的重要性,提供了清晰的代码示例,帮助开发者编写更整洁和高效的代码。无论是新手还是经验丰富的开发者,这些技巧都将显著提升您的编码能力,使您在项目中更具竞争力。
29 2
|
2月前
|
Python
axios的get请求传入数组参数
【10月更文挑战第11天】 当使用 `axios` 发送包含数组参数的 GET 请求时,默认的序列化方式可能与后端(如 Django)不兼容,导致无法正确获取数组参数。解决方案是通过 `paramsSerializer` 指定自定义序列化函数,或使用 `qs` 库来格式化数组参数,确保前后端一致。示例代码展示了如何使用 `qs` 库设置 `arrayFormat` 为 `&quot;repeat&quot;`,以符合 Django 的解析要求。
38 2
|
2月前
|
前端开发 JavaScript 开发者
JS 异步解决方案的发展历程以及优缺点
本文介绍了JS异步解决方案的发展历程,从回调函数到Promise,再到Async/Await,每种方案的优缺点及应用场景,帮助开发者更好地理解和选择合适的异步处理方式。