一段致命代码

今天测试代码,发现一个致命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{

      })
    },

这段代码的问题是,我删第一个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循环的数组进行增删操作

你可能感兴趣的:(一段致命代码)