gpt4 book ai didi

javascript - 如何知道你的递归函数已经结束

转载 作者:行者123 更新时间:2023-12-03 02:45:08 24 4
gpt4 key购买 nike

我有一个递归函数,可以遍历所有目录并将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 开始的所有目录,当它是目录时创建 key ,否则调用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com