promise.all返回的promise不是async函数返回的promise(全选全不选操作)

因为是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循环解决了
    },

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值