问题描述
下午做购物车结算的数据变化时,用了双层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);
}
})
}
})
}