我有一个递归函数,该函数会遍历所有目录并将bmp文件放在JSON数组中,其中的键或文件夹以及子数组是每个文件夹的内容(我不知道我是否清楚)。例如,此文件系统:- data/ |- hello/ |- j.bmp |- t.bmp - ok/ |- c.bmp
会给出这样的东西:
{"data":{
"hello":{
"j.bmp":"j.bmp"
},
"t.bmp":"t.bmp"
},
"ok":{
"c.bmp":"c.bmp"
}
}
所以这是我的代码:
function preload(res_dir, nextfunc, errorfunc){
let images = {}
let c = document.createElement("CANVAS");
function travelDir(directory){
let dirReader = directory.createReader();
dirReader.readEntries(function(subdirs){
subdirs.forEach(function(entry){
if (entry.isDirectory){
let path = entry.toURL().replace(res_dir.toURL(),"").split("/");
let a = images;
for (var i = 0; i < path.length - 2; i++){
a = a[path[i]];
}
a[entry.name] = {};
travelDir(entry);
} else if (entry.name.substr(entry.name.length - 4, 4) == ".bmp"){
loadres(entry);
}
});
}, errorfunc);
}
travelDir(res_dir);
function loadres(file){
let a = images;
let path = file.toURL().replace(res_dir.toURL(),"").split("/");
for (var i = 0; i < path.length - 1; i++){
a = a[path[i]];
}
a[file.name] = file.name;
}
}
travelDir函数遍历从res_dir开始的所有目录,在目录下创建密钥,否则调用loadres在JSON数组
images
中添加文件名这工作得很好,但是我怎么知道这些功能何时遍历所有目录?
(如果需要,我需要在整个过程结束时执行功能
nextfunc
,当它包含整个文件树时,以images
作为参数) 最佳答案
由于您的代码是异步的,因此递归并不容易管理。您不能只从自身内部调用travelDir
,因为父函数仅在子项完成时才完成,而这并不是您在调用它的时刻。
如果您的工具链支持ES7,则只需使用async/await
,即:
async function travelDir(directory) {
.... await travelDir(subdir)
}
await travelDir(root)
nextfunc()
否则,与其直接产生一个子代,不如将其放置在队列中,并具有一个回调,该回调处理队列中的下一个项目,并在其为空时调用
nextfunc
,方法如下:let queue = [];
function step() {
if (!queue.length)
nextfunc(); // <-- ends here
else
travelDir(queue.shift())
}
function travelDir(directory) {
...
dirReader.readEntries(parseEntries, errorfunc);
}
function parseEntries(subdirs) {
subdirs.forEach(function (entry) {
if (entry.isDirectory)
queue.push(entry);
else ...
loadres(entry);
});
step() // <-- indirect recursion
}
queue.push(res_dir)
step()
关于javascript - 如何知道您的递归函数已结束,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48132331/