异步Javascript是';它不同步';t等待阵列进程在丢弃事件时完成

异步Javascript是';它不同步';t等待阵列进程在丢弃事件时完成,javascript,jquery,arrays,javascript-objects,dom-events,Javascript,Jquery,Arrays,Javascript Objects,Dom Events,问题在于,我有一个arr_x数组,我调用“call_when_drop”函数,如下所示: <body ondrop="call_when_drop(event,this);" ></body> 注意:我注意到,如果我像下面这样更改traverseFileTree函数,它会工作,但我需要在函数的工作版本之前进行更改 function traverseFileTree(item, path,connection_time) { if(arr_x.length>25)

问题在于,我有一个arr_x数组,我调用“call_when_drop”函数,如下所示:

<body ondrop="call_when_drop(event,this);" ></body>
注意:我注意到,如果我像下面这样更改
traverseFileTree
函数,它会工作,但我需要在函数的工作版本之前进行更改

 function traverseFileTree(item, path,connection_time) {
if(arr_x.length>25){
    return arr_x;
}


arr_x[arr_x.length]=arr_x.length;
  traverseFileTree();
  return arr_x;
}

由于这显然是一个chrome独有的问题(webkitGetAsEntry函数限制了使用),我可以看到如何使用良好的ol承诺来实现这一点——不仅仅是chrome支持承诺,只是因为这是一个chrome问题,我可以确定承诺是可用的

注意:我看到至少firefox实际上有webkitGetAsEntry函数!!!)

我已经在Firefox中进行了测试,现在我知道它有webkitGetAsEntry函数-概念验证-


研究回调。从流中读取不会阻止IO。它基本上是在同一时间完成所有这些任务,而不是等待它们完成finish@magreenberg请注意我更新的问题,我如何修复它?
javascript有一个bug,它不等待
-您的实际问题是
异步javascript不同步
@JaromandaX好的,我已经更改了标题,我怎样才能解决这个问题?哈哈-不要改变标题,伙计!!!我需要像以前一样在forwhy中检测dirReader的索引,您不在任何地方使用它。最终的console.log是一个数组-因此,每个条目都有一个indexI已测试过的索引,但当我删除包含子文件夹的文件夹时,它不起作用,只有console.log父文件夹真的吗?我测试了一个包含37个子文件夹的文件夹,果然在最终结果中得到了38个完整的子文件夹
function call_when_drop(e,element){


 var items = e.dataTransfer.items;

    for (var i = 0, item; item = items[i]; ++i) {

      if (item.kind == 'file') {


          var a = traverseFileTree(item.webkitGetAsEntry(),"");


       console.log(arr_x);
     console.log('with_setTimeout');
        console.log(arr_x.length);
     console.log('---------------------------------------');
     setTimeout(function(){

        console.log('with_setTimeout');
        console.log(arr_x.length);

     },300);

      }
    }


}
 function traverseFileTree(item, path,connection_time) {
if(arr_x.length>25){
    return arr_x;
}


arr_x[arr_x.length]=arr_x.length;
  traverseFileTree();
  return arr_x;
}
var readEntriesPromise = function() {
    return new Promise((resolve, reject) => this.readEntries(resolve, reject));
};

function traverseFileTree(item, path, connection_time) {
    path = path || "";
    if (item.isDirectory) {
        var dirReader = item.createReader();
        dirReader.readEntriesPromise = readEntriesPromise;
        return dirReader.readEntriesPromise()
            .then(entries => entries.filter(entry => entry.isDirectory))
            .then(dirs => Promise.all(dirs.map(entry => traverseFileTree(entry, path + item.name + "/", connection_time))))
            .then(result => [].concat.apply([path + item.name], result));
    } else {
        return Promise.resolve("NO FOLDER"); // initial item was not a folder
    }
}

function call_when_drop(e, element) {
    var items = e.dataTransfer.items;
    [].filter.call(items, item => item.kind == 'file')
        .forEach(file => traverseFileTree(file.webkitGetAsEntry(), "")
            .then(function(results) {
                console.log(results);
            })
        )
}