循环中调用异步接口获取数据

前言

遇到这样一个需求:调用接口,返回一个新闻列表,再循环这个新闻列表,用每个新闻的id异步请求这个新闻的视频地址,这就需要在循环里调用接口。如果用for循环,接口还没请求完成,for循环就已经执行完了。所以改成promise去处理。

开始

整体思路就是:先存数组,然后循环生成每一个promise,然后用promise.all来调用,then的时候返回的是一个结果数组。

1、首先定义循环里的异步请求

getInfo(item ,index){
			return new Promise((resolve,reject) => {
				axios.post('/videoUrl',{id:item.id}).then(res=>{
					let url = res.data;
					resolve({id:item.id,url:url})
				})
			})
		}

2、newsList为开始接口获取的新闻列表,对新闻列表进行循环,得到一个promise数组。

let promiseArr = this.newsList.map((item,index) => {
				    return this.getInfo(item, index)
				 })

3、用promise.all来调。

Promise.all(promiseArr).then(value=>{
						console.log(value);
					 //value:[{id: 1, url: "xxxxx"},
					// 		  {id: 2, url: "xxxxx"},
					// 		  {id: 3, url: "xxxxx"}]
						this.newsList = value;
					})

这样就拿到了包含新闻视频地址的新闻列表。

全部代码

<script>
export default {
	name: 'empty',
	data () {
		return {
			newsList:[]//新闻列表
		}
	},
	methods:{
			getNewsList(){
				axios.get('/newsList').then(res=>{
					this.newsList = res.data;//newsList = [{id:1},{id:2},{id:3}];
					let promiseArr = this.newsList.map((item,index) => {
						return this.getInfo(item, index)
					})
					Promise.all(promiseArr).then(value=>{
						console.log(value);
					 //value:[{id: 1, url: "xxxxx"},
					// 		  {id: 2, url: "xxxxx"},
					// 		  {id: 3, url: "xxxxx"}]
						this.newsList = value;
					})
				})
			},
			// 通过新闻id请求新闻视频地址
			getInfo(item ,index){
				return new Promise((resolve,reject) => {
					axios.post('/videoUrl',{id:item.id}).then(res=>{
						let url = res.data;
						resolve({id:item.id,url:url})
					})
				})
			}
	},
	mounted(){
		this.getNewsList();
	}
}
</script>

后记

1、首先关于后台修改接口,正常返回应该是newsList里就返回了视频地址,协商过就是需要单独去调用。
2、这个问题的解决花费了时间,特此记录。文章参考javascript for循环+异步请求导致请求顺序不一致

对于使用 for 循环调用接口进行优化,有几个常见的方法可以考虑: 1. 批量处理:如果接口支持批量操作,可以将多个请求合并为一个批量请求,减少网络传输和接口调用的开销。这样可以减少循环次数,提高效率。 2. 并发请求:使用多线程、多进程或异步操作来并发发送多个请求,以减少等待时间。可以使用线程池或协程来管理并发操作,但要注意控制并发量,避免对接口服务器造成过大负荷。 3. 数据缓存:如果接口返回的数据可以缓存,可以考虑使用缓存来避免重复调用接口。可以使用内存缓存、数据库或其他缓存技术,根据数据的更新频率和实时性需求选择合适的缓存策略。 4. 分页查询:如果接口支持分页查询,可以通过设定合适的每页数据量和页码参数来获取特定范围的数据,避免一次性获取全部数据。这样可以减少接口调用次数和数据传输量。 5. 请求参数优化:根据接口的特性和需求,优化请求参数的设置,避免不必要的参数传递和数据处理。可以根据实际情况整参数格式、过滤条件、排序方式等,减少数据传输和处理的开销。 需要根据具体情况选择合适的优化方法,并综合考虑接口性能、数据实时性、系统资源等因素进行权衡。同时,也要注意遵守接口的使用规范和限制,避免对接口服务端造成过大压力或违反服务协议。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值