异步Javascript是';它不同步';t等待阵列进程在丢弃事件时完成
问题在于,我有一个arr_x数组,我调用“call_when_drop”函数,如下所示:异步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)
<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);
})
)
}