微信小程序js双层for循环,数据不更新,局部变量无法变化

问题描述

下午做购物车结算的数据变化时,用了双层for循环,内部使用if来判断是否是同一件商品,然后出现了一个奇怪的现象:
每一次if内部,数据都改变了;但是一旦出了if,数据又按照初始的进行下一次变化,等于最后只能保留住最后一次变化。

我对很多处都进行了输出,确认了if的确被执行了。

原因分析

刚开始比较懒,在双层循环里接连对购物车缓存和商品信息缓存都进行了改变,导致很容易出现异步现象,即当b要使用a的数据,但是a的运算还未结束,b仍会使用,造成很多不可预知的麻烦。

一般都会在发起请求的时候出现,但是这次,循环花费的时间太长了,所以也出现了该问题。并且进行多次if来改变数据时,尤其容易出错。

解决方案

把两个过程拆开来,因为都要用到欲购买的商品的缓存作为参考,所以get两次缓存,分别在success方法下进行其他操作,确保取到了值。
并且在存、取缓存时使用同步方法。

修改后的代码如下:

//如果是从购物车进来的
          //改变缓存中多个商品的状态
          //读取缓存进行操作

          wx.getStorage({//买了的
            key: 'buy_products',
            success: function (op) {
              //修改商品的,在遍历想买的商品
             for(let z=0;z<op.data.length;z++){
              //修改数据库还是缓存,修改缓存,再更新数据库
              var res1=wx.getStorageSync('productlist')
                  //遍历商品列表,找到跟这个id一样的。修改缓存          
                  for (let x = 0; x < res1.length; x++) {
                      if(op.data[z].id==res1[x].id){
                        res1[x].productnum = res1[x].productnum - op.data[z].buynum;
                        res1[x].sellnum = res1[x].sellnum + op.data[z].buynum;
                      }
                  }
                  //修改缓存
                  wx.setStorageSync('productlist', res1)
              }
              that.saveToProductDB(res1)
              }
              })


        //新建一个取缓存 对购物车缓存操作
               wx.getStorage({//买了的
                 key: 'buy_products',
                 success: function (op) {
                 //修改购物车的
               wx.getStorage({
                 key: 'carlist',
                 success: function (res) {
                   //遍历购物车的商品列表,找到跟这个id一样的,直接删掉
                   for(let y=0;y<op.data.length;y++){
                   for (let x = 0; x < res.data.length; x++) {
                     if (op.data[y].id == res.data[x].id) {
                        res.data.splice(x,1);
                     }
                     wx.setStorage({
                       key: 'carlist',
                       data: res.data,
                     })
                   }
                 }
                   that.saveToShopCarDB(res.data);
                 }
               })
             }
            })
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值