Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript file方法使dataTransferItemList为空_Javascript_Html - Fatal编程技术网

Javascript file方法使dataTransferItemList为空

Javascript file方法使dataTransferItemList为空,javascript,html,Javascript,Html,我正在尝试实现上传文件和文件夹的功能。我在chrome中删除了一些文件和文件夹,然后得到了dataTransferItemList类型的条目列表,然后我想对列表中的每个条目执行一些操作。我使用webkitGetAsEntry函数获得一个条目,当我尝试调用FileEntry对象dataTransferItemList的file函数时,该条目变为空 _processEntries: function () { //this._entries list of entries of ty

我正在尝试实现上传文件和文件夹的功能。我在chrome中删除了一些文件和文件夹,然后得到了dataTransferItemList类型的条目列表,然后我想对列表中的每个条目执行一些操作。我使用webkitGetAsEntry函数获得一个条目,当我尝试调用FileEntry对象dataTransferItemList的file函数时,该条目变为空

_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);

}
afterInit:function(){
this.uploads=[];
this.entries=[];
对于(var i=0;i=0&&i0)
这是双倍体(0);
}
请记住,.file()和.readEntries()是异步的。这意味着您的方法将立即返回,并且允许JS引擎“释放”资源。由于是异步的,有一个时刻(即当您的方法返回时)dataTransferItemList超出范围,因此被释放(设置为null)

正如您在我的代码中看到的,由于对.file()或.readEntries()的异步调用,在我的项超出范围之前,我预防性地保存了调用.webkitGetAsEntry()的项引用


希望这有帮助,我花了2个小时调试这个,然后才想出解决方案

我也为此头疼不已

我就是这样解决的

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);

}
afterInit:function(){
this.uploads=[];
this.entries=[];
对于(var i=0;i=0&&i0)
这是双倍体(0);
}
请记住,.file()和.readEntries()是异步的。这意味着您的方法将立即返回,并且允许JS引擎“释放”资源。由于是异步的,有一个时刻(即当您的方法返回时)dataTransferItemList超出范围,因此被释放(设置为null)

正如您在我的代码中看到的,由于对.file()或.readEntries()的异步调用,在我的项超出范围之前,我预防性地保存了调用.webkitGetAsEntry()的项引用

希望这有帮助,我花了2个小时调试这个,然后才想出解决方案