小程序製做中 一個奇怪的bug

事情是這樣的:原一個購物車 合併本地數據和服務器 數據方法以下 ,正常測試沒有問題,當每次從新登陸,會調用到這個方法,就會莫名其妙的卡主,debug 發現 a1.length =77731508 致使卡死服務器

可是 console.log(a1) 長度是正常的。。。async

 async getMergeCart(){ let a1 = await this.getLocalCart();//本地數據
    let a2 = await this.getServeCart();//服務器數據
    let arr=a1;//先賦值給arr a1
 console.log('debug',a1); console.log('debug',a2); if(a1.length === 0){ return a2;//若是本地沒數據 返回服務器數據。。。。
 } for(let i=0;i<a1.length;i++){ for(let j=0;j<a2.length;j++){ if(a1[i].id!=a2[j].id){ arr.push(a2[j]); } } } return arr; }

 

=======================================問題解決=================================================測試

緣由在於  arr.push(a2[j]); this

當前arr 是 a1 的淺拷貝 就是a1的引用 ,arr修改 對應a1也會修改spa

循環若是出現 有id不相同狀況 會致使 a1.length 增加致使 無限循環-debug

上面寫法就是錯誤的。。。。腦子抽了code

正確寫法:blog

 async getMergeCart(){ //合併數據應當以本地數據爲主!
    const a1 = await this.getLocalCart(); const a2 = await this.getServeCart(); //長度先肯定好..由於.length 是變長?
    let len_a1 = a1.length; if(a1.length === 0){ return a2;//若是本地沒數據 返回服務器數據。。。。
 } //必須使用len ---該bug當服務器數據和本地數據相同時不會觸發,因此有隱蔽性。。。
    for(let i=0; i<len_a1; i++){ for(let j=0;j<a2.length;j++){ if(a1[i].id==a2[j].id){ a1.splice(i,1);//移除對應key
          i--;//當前key 被移除 須要對應key前移一位
          len_a1--;//當前key 被移除 須要長度減一位
          break; } } } for(let i=0;i<a2.length;i++){ a1.push(a2[i]); } return a1; }
相關文章
相關標籤/搜索