2012-08-24 22 views
0

我試圖實現上傳文件和文件夾的功能。我在chrome中刪除了一些文件和文件夾,然後我得到了dataTransferItemList類型的條目列表,然後我想對列表中的每個條目執行一些操作。我得到一個webkitGetAsEntry函數的條目,當我嘗試調用FileEntry對象的文件函數dataTransferItemList變爲空時。FileEntry.file方法使dataTransferItemList爲空

_processEntries: function() { 
     //this._entries list of entries of type dataTransferItemList 
     var entry = this._getNetxFileEntry(this._entries); 
     if (!isNullOrUndefined(entry)) { 
      if (entry.webkitGetAsEntry) { 
       entry = entry.webkitGetAsEntry(); 
      } else { 
       //TODO: code for other browsers without getAsEntry implementation 
      } 

      if (entry.isFile) { 
       this._readAsFileEntry(entry); 
      } 
      else if (entry.isDirectory) { 
       this._readAsDirectoryEntry(entry); 
      } 
     } 
    }, 

    _readAsFileEntry: function (fileEntry) { 
     fileEntry.file($.proxy(this._onFileSuccessfullyRead, this)); 
    }, 

    _onFileSuccessfullyRead: function (file) { 
     //Here this._entries becomes empty so i can't read next entry 
    }, 

爲什麼會發生這種情況,我該如何處理這種情況下的所有內容? 感謝您的幫助。

回答

1

我也有很多令人頭疼的事情。

我解決了這個方式

afterInit : function() { 

    this.uploads = []; 

    this.entries = []; 
    for (var i = 0; i < this.options.items.length; i++) 
     this.entries.push(this.options.items[i].webkitGetAsEntry()); 

    this.scan(0); 

}, 

scan : function(i) { 

    if (i >= 0 && i < this.entries.length) { 

     var entry = this.entries[i]; 

     if (entry.isDirectory) { 
      entry.createReader().readEntries(this.readEntries.bind(this, i + 1)); 
     } else if (entry.isFile) { 
      this.manageFileEntry(entry); 
      this.scan(i + 1); 
     } 

    } else if (this.uploads.length > 0) 
     this.doUpload(0); 

} 

記住.file()和.readEntries()是異步的。這意味着你的方法將立即返回並且JS引擎被允許「釋放」資源。因爲它是異步的,所以有一段時間(即當你的方法返回時),dataTransferItemList超出了範圍,因此釋放(設置爲空)。

正如您在我的代碼中所看到的,由於對.file()或.readEntries()的異步調用,在我的項目超出作用域之前,我預防性地保存了調用.webkitGetAsEntry()的條目引用。

希望這會有所幫助,我花了2個小時調試這個之前找出解決方案!