FileEntry.file方法使dataTransferItemList为空
FileEntry.file method makes dataTransferItemList empty
我正在尝试实现上传文件和文件夹的功能。我在chrome中删除了一些文件和文件夹,然后我得到了dataTransferItemList类型的条目列表,然后我想对列表中的每个条目执行一些操作。我用webkitGetAsEntry函数得到一个条目,当我试图调用FileEntry对象的文件函数时,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
},
为什么会发生这种情况,我如何处理这种情况下的所有实体?谢谢你的帮助。
我也为此头疼不已。
我用这种方法解决
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超出范围,并且因此被释放(设置为null)。
正如你在我的代码中看到的,在我的项目由于异步调用.file()或.readEntries().而超出范围之前,我会预防性地保存调用.webkitGetAsEntry()的条目引用
希望这能有所帮助,在找到解决方案之前,我花了2个小时调试它!
相关文章:
- 没有找到相关文章