美文网首页
一段致命代码

一段致命代码

作者: 一个废人 | 来源:发表于2018-03-09 21:38 被阅读13次

    今天测试代码,发现一个致命bug,在做删除文件处理时,我通过文件名查找当前删除项,结果由于没有考虑到文件列表里会出现同名文件,所以对本文件的删除可能会导致同名文件也被删除。

    deleteExistedFile(file){
          let data = {}
          data.loanId = this.loanId
          data.docId = this.loanDocument.id
          data.filename = file.name
          return remove(data).then((res)=>{
            for(let i=0;i<this.fileStack.length;i++){
              let item = this.fileStack[i]
              if(item.name === file.name || item === file.name){
                this.fileStack.splice(i,1)
              }
            }
            this.validate()
          }).catch((e)=>{
    
          })
        },
    

    这段代码的问题是,我删第一个fan.jpg时,i=0,fileList被splice掉了第一个。第二次循环时i=1,之前为i=2时的fan.jpg在此时已经变成新的fileList里的i=1。结果就是,删第一个fan.jpg时,会把第三个fan.jpg删掉。
    致命原因为:我对正在循环的数组进行了“增删”操作

    1171520600785_.pic.jpg 1191520600965_.pic.jpg

    于是我把用文件名查找改成了通过fileStack的index查找,这样就避免了多删的情况:

    deleteExistedFile(file, index){
          let data = {}
          data.loanId = this.loanId
          data.docId = this.loanDocument.id
          data.filename = file.name
          return remove(data).then((res)=>{
            this.fileStack.splice(index,1)
            this.validate()
          }).catch((e)=>{
            
          })
        },
    

    但是,这样写只能适用于单文件一个个删除,如果多文件同时删除的话,又会出现问题。
    所以,我能想最好的解决方式就是,先通过循环的方式给数组里要删除的item加上readyToRemove=true的标签,循环结束,再对加了标签的新数组进行map,去除item. readyToRemove=true的项。

    核心思想

    千万不要对正在for循环的数组进行增删操作

    相关文章

      网友评论

          本文标题:一段致命代码

          本文链接:https://www.haomeiwen.com/subject/uximfftx.html