promise.all([]).then(() => {}).catch(() => {})异步处理

场景:在同一时间,同时调用相同的接口(唯一不同:接口传参不一样)

简单写法:

Promise.all([
		this.snapApi(this.list[0].deviceId,0),
		this.snapApi(this.list[1].deviceId,1)
]).then(() => {
    
    
	//成功时候操作(特别要注意这里面,如果是下标0,还是下标1,执行完都会执行到这里来,而且没有先后顺序,完全是看snapApi函数执行的速度!!!!!!)
}).catch(() => {
    
    
		//失败操作
})

那么 当list数组字段长度未知时,采用

this.list.forEach((item, index) => {
    
    
	Promise.all([this.snapApi(item.deviceId, index)])
	.then(() => {
    
    
		//现在执行场景就是,当list数组,执行完snapApi函数后,进行后续操作(执行最后一个参数,返回成功时在执行下面内容)
		//错误写法(例如,下标1,执行完,那么当时index是1,会执行if里面的操作,而然并没有下标0,操作返回就执行后续操作,血的教训!!!!!千万不要这么写)
		//可以在snapApi中加累加器 ,然后这里通过if判断累加的个数是否与list数组个数相同在执行后续操作(有大神有更好,欢迎推荐)
		if(index === this.list.length -1) {
    
    
			
		}
	})
	.catch(() => {
    
    
		//错误操作
	})
})

也可以在promise.all([])数组里直接调用接口

this.list.forEach((item, index) => {
    
    
	Promise.all([
	 	apis.snap({
    
    deviceinfoId: item.deviceId})
	])
	.then(([img]) => {
    
        //这数组里面的东西,就是接口返回的内容
		//返回数据进行 业务操作
		
	})
	.catch(() => {
    
    
	})
})

补充
同时执行两个接口

async getData() {
    
    
	let [res1,res2] = await Promise.all(
		[getEncodeParam(param), getVideo(param2)].map(api => {
    
    
			//返回接口的错误,这样即使有一个接口报错,也能获取另外一个成功的接口数据
			return api.catch(function(err) {
    
    
			 	return err;
			})
		})
	)
}
 

猜你喜欢

转载自blog.csdn.net/weixin_43843679/article/details/117558083