Javascript 清除以前拖动的文件条目?

Javascript 清除以前拖动的文件条目?,javascript,google-chrome,drag-and-drop,promise,Javascript,Google Chrome,Drag And Drop,Promise,我有下面的脚本,我想用来上传文件。它的工作很好,但我有困难试图找出为什么每次我上传一个新的文件,以前的文件被拖动也存在。由于程序的异步性,我在调试这个时遇到了麻烦 小提琴: 代码: var dndbox=$(“.dndbox”)[0]; dndbox.addEventListener(“dragenter”,函数(e){ e、 停止传播(); e、 预防默认值(); },假); dndbox.addEventListener(“dragover”,函数(e){ e、 停止传播(); e、 预防

我有下面的脚本,我想用来上传文件。它的工作很好,但我有困难试图找出为什么每次我上传一个新的文件,以前的文件被拖动也存在。由于程序的异步性,我在调试这个时遇到了麻烦

小提琴:

代码:

var dndbox=$(“.dndbox”)[0];
dndbox.addEventListener(“dragenter”,函数(e){
e、 停止传播();
e、 预防默认值();
},假);
dndbox.addEventListener(“dragover”,函数(e){
e、 停止传播();
e、 预防默认值();
},假);
dndbox.addEventListener(“删除”,函数(e){
e、 停止传播();
e、 预防默认值();
var itemList=e.dataTransfer.items;
var fp=[];
变量遍历=函数(条目)
{
if(entry.isFile){
entry.file(函数(文件){
var filepromise=新承诺(函数(res,rej){
res(文件);
});
fp.push(文件承诺);
});
}else if(entry.isDirectory){
var dR=entry.createReader();
dR.readEntries(函数(条目){
对于(变量i=0;i
每次我上传一个新文件时,之前拖动的文件也会出现

这不是由于
遍历的异步特性造成的,与承诺没有多大关系。这是由于这种结构:

// left away some irrelevant callbacks
dndbox.addEventListener("drop", function(e) {
    var fp = [];
    // add entries to fp
    $(".prompt").on("click", function() {
        console.log(fp);
    });
}, false);
如您所见,每次删除某个内容时,您都会创建一个新列表,并将侦听器添加到(从现在开始的每次单击都会记录该列表的)元素中。要解决该问题,您可以:

  • 仅使用一个全局列表,如果发生新的删除事件,该列表将被覆盖
  • 为每个要记录的列表创建一个新的
    .prompt
    元素
  • 在启动侦听器后卸载它,以便不再触发它。您可以使用jQuery来实现这一点

除此之外,你使用承诺的方式非常奇怪(更不用说是错误的)
collection
是使用仍然为空的
fp
数组立即解析的承诺列表。幸运的是,当触发
单击
回调时,所有文件都被读入。尽管如此,每个
pa
都会得到
==fp
,因此您在
fp
中记录每个项目的次数与
itemList
的长度相同

请看一看并了解如何正确地执行此操作。在你的情况下,它会像

function traverse(entries)
    var collection = [];
    for (var i=0; i<entries.length; i++) {
        var entry = entries[i];
        if (entry.isFile) {
            collection.push(new Promise(function(res, rej) {
                entry.file(res);
            }));
        } else if (entry.isDirectory){
            collection.push(new Promise(function(res, rej) {
                var dR = entry.createReader();
                dR.readEntries(res);
            }).then(traverse));
        }
    }
    return Promise.all(collection).then(function(results) { // flatten
        return [].concat.apply([], results);
    });
}

var entries = [];
for(var i = 0; i < itemList.length; i++)
    entries[i] = itemList[i].webkitGetAsEntry();

traverse(entries).then(function(fp) {
    $(".prompt").show().one("click", function() {
        $(this).hide();
        fp.forEach(console.log, console);
    });
});
函数遍历(条目)
var集合=[];

对于(var i=0;我知道……谢谢。这看起来是一个很大的头痛问题。我理解,但我觉得我需要花很长时间才能弄明白。我想我只是需要习惯使用承诺。这是我第一次需要这么多承诺。我希望我能给你小费,喝点比特币/狗币之类的东西!再次感谢你!
function traverse(entries)
    var collection = [];
    for (var i=0; i<entries.length; i++) {
        var entry = entries[i];
        if (entry.isFile) {
            collection.push(new Promise(function(res, rej) {
                entry.file(res);
            }));
        } else if (entry.isDirectory){
            collection.push(new Promise(function(res, rej) {
                var dR = entry.createReader();
                dR.readEntries(res);
            }).then(traverse));
        }
    }
    return Promise.all(collection).then(function(results) { // flatten
        return [].concat.apply([], results);
    });
}

var entries = [];
for(var i = 0; i < itemList.length; i++)
    entries[i] = itemList[i].webkitGetAsEntry();

traverse(entries).then(function(fp) {
    $(".prompt").show().one("click", function() {
        $(this).hide();
        fp.forEach(console.log, console);
    });
});