场景:在同一时间,同时调用相同的接口(唯一不同:接口传参不一样)
简单写法:
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;
})
})
)
}