因为是async,await是异步操作就直接跳过了,所以打印的是空数组
// 全选全不选
async updateCartAll({commit,dispatch},isChecked){
// 要对 shopCartList 购物车清单进行遍历,而shopCartList又是一个两维数组,所以需要进行嵌套循环
// 相当于遍历了商铺
let promises = []
state.shopCartList.forEach((item)=>{
// 相当于在商铺里再遍历它的商品
item.cartInfoList.forEach(async(cItem)=>{
// 想要通过接口请求去更新商品的选中状态
// 如果当前全选的状态不等于cItem的选中状态,我们进行更新操作
// 如果一致则不用操作
if(isChecked !== cItem.isChecked){
// 利用之前写好的选中状态函数重新调用一下即可
// 调用后的函数只对于当前选中状态不统一的更新
// 在action中调用另一个action,在主动调的那个action,第一个参数对象中的第二个参数,加上dispatch
// dispatch是一个函数
const promise = await dispatch('updateCart',{skuId:cItem.skuId, isChecked})
promises.push(promise) //将返回的结果放入到promises
}
})
})
// 需要利用Promise.all去确认async/await的每个异步操作都是成功的
return Promise.all(promises)//目前打印出来的是空数组【】,看上去是有bug问题的
}
};
原因:因为forEach是无序的,例如forEach中使用async遍历1.2.3,它第一个可能是1.2.3,第二次也有能是3.2.1,所以使用forEach时不能使用async。
解决办法:使用for循环加上async就可以解决这种bug问题
},
// 删除选中的商品
async deleteCartAll({commit,dispatch}){
let promises = []
for(let i = 0; i <state.shopCartList.length; i++){
for(let j=0; j < state.shopCartList[i].cartInfoList.length; j++){
// 如果要进行选中商品的删除,则可以利用isChecked进行条件判断
if(state.shopCartList[i].cartInfoList[j].isChecked === 1){
const promise = await dispatch('deleteCart',state.shopCartList[i].cartInfoList[j].skuId)
promises.push(promise) //将返回的结果放入到promises
}
}
}
return Promise.all(promises) //异步问题已用for循环解决了
},