Vue页面多个axios请求得到数据后在渲染页面

上网导航 2023-10-02 321 0条评论
摘要: 问题描述:当我们访问页面时,axios请求还没获得数据,,就渲染了页面,导致页面为空,这种情况很不稳定,取决于你后端接口速度。原因:因为axios请求是异步请求...

问题描述:

当我们访问页面时,axios请求还没获得数据,,就渲染了页面,导致页面为空,这种情况很不稳定,取决于你后端接口速度。

原因:

因为axios请求是异步请求,假如当你的页面在最开始渲染的时候同时发送多个axios请求,如果后端接口返回数据的时间为1秒,那么在axios请求发出后,系统会去执行vue中的其他代码,当等你axios请求接收到数据后再去获取数据,此时已经过去1秒了,你的页面可能已经渲染完了,所以就可能会出现有时候页面有数据,有时候没数据,或者每次切换页面都是上一次访问的数据。

解决:使用 Promise.all

//created()在模板渲染成html前调用,即通常初始化某些属性值,然后再渲染成视图.
created() {
	Promise.all([
		new Promise((resolve) =>{
		''
		假设这一块是axios请求
		我们使用 setTimeout 代替axios请求
		''
		setTimeout(()=>{resolve('这个数据获取需要1秒')},1000)
		}),
		new Promise((resolve) =>{
		setTimeout(()=>{resolve('这个数据获取需要5秒')},5000)
		})
	]).then(res => {
		console.log(res)
		// 返回 = ['这个数据获取需要1秒', '这个数据获取需要5秒']
		//此时在去执行渲染页面,就可以保证数据的获取
		console.log("下面开始渲染表格等内容....")
		
	})
}

Promise.all会等待列表中所有请求或则函数中的resolve返回数据后在去执行

		Promise.all([
				new Promise((resolve) =>{
					axios({
						method:'get',
						url: "xxxxxxxxxxxxx",
						params: {
							userid: this.userid
						}
					}).then(res=> {
						this.data1= res.data
						resolve("data1")
					})
				}),
				new Promise((resolve) =>{
					axios({
						method:'get',
						url: "xxxxxxxxxxxxx",
						params: {
							userid: this.userid
						}
					}).then(res=> {
						this.data2= res.data
						resolve("data2")
					})
				}),
				new Promise((resolve) =>{
					axios({
						method:'get',
						url: "xxxxxxxxxxxxx",
						params: {
							userid: this.userid
						}
					}).then(res=> {
						this.data3= res.data
						resolve("data4")
					})
				}),
				new Promise((resolve) =>{
					axios({
						method:'get',
						url: "xxxxxxxxxxxxx",
						params: {
							userid: this.userid
						}
					}).then(res=> {
						this.data4= res.data
						resolve("data4")
					})
				}),
				new Promise((resolve) =>{
					axios({
						method:'get',
						url: "xxxxxxxxxxxxx",
						params: {
							userid: this.userid
						}
					}).then(res=> {
						this.data5= res.data
						resolve("data5")
					})
				}),
				new Promise((resolve) =>{
					axios({
						method:'get',
						url: "xxxxxxxxxxxxx",
						params: {
							userid: this.userid
						}
					}).then(res=> {
						this.data6= res.data
						resolve("data6")
					})
				}),
				new Promise((resolve) =>{
					axios({
						method:'get',
						url: "xxxxxxxxxxxxx",
						params: {
							userid: this.userid
						}
					}).then(res=> {
						this.data7= res.data
						resolve("data7")
					})
				}),
				new Promise((resolve) =>{
					axios({
						method:'get',
						url: "xxxxxxxxxxxxx",
						params: {
							userid: this.userid
						}
					}).then(res=> {
						this.data8= res.data
						resolve("data8")
					})
				})
			]).then(res => {
				console.log(res)
				//["data1","data2","data3","data4","data5","data6","data7","data8"]
				
				/*
				
				渲染页面的代码
				
				*/
			})

文章版权及转载声明:

作者:上网导航本文地址:https://www.90xe.com/post/5410.html发布于 2023-10-02
文章转载或复制请以超链接形式并注明出处技术导航

分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏