promise.all()该方法用于将多个Promise实例,包装成一个新的Promise实例。
问题:(请求采用的是jquery的ajax)通过接口a获取数据列表List1,需要对list1中每项通过id进行校验(通过接口b进行校验),并将校验结果添加属性值verifyStatus,并渲染到vue2的项目中
解决办法:
对a和b的请求用Promise包裹,resolve(res),然后用Promise.all(所有要校验的promise数组)就可全部获得,
Promise.all 里面参数为一个数组,数组的每一项是一个返回promise 的函数调用
- Promise.all([fn(),fn()]) 都返回resolve(); 才能够拿到成功的返回值
- Promise.all([fn(),fn()]) 有一个返回reject(), 则进入catch(error), 拿到失败的返回值
verifyAgree: function (did, aj) {//校验接口b
return new Promise((resolve, reject) => {
$.ajax({
url: global_ip + '',
dataType: 'json',
type: 'post',
data: {
token: ls_token,
did: did,
aj: aj,
}
}).done(function (res) {
tokenFail(res);
let data = {
aj: aj,
status: res.status,
info: res.info
}
resolve(data)
}).fail(function (err) {
reject(err);
})
})
},
//veriList.data为a接口的请求数据
veriList.data.forEach(item => {
arr.push(ajax.verifyAgree(vthis.$data.did, item.ajnum))
})
try{
let res = await Promise.all(arr)
veriList.data.forEach(item => {
console.log(res);
res.forEach(item1 => {
if (item.ajnum == item1.aj) {
item.veriAgree = item1.status
}
})
})
vthis.$data.subList.rows = veriList.data
vthis.$data.subList.total = veriList.data.length;
vthis.$data.subList.allPage = veriList.data.length / vthis.$data.subList.size;
$('.layer').fadeIn(300).find('.set_subManage').show().siblings().hide();
}catch (e) {
}