gpt4 book ai didi

javascript - 异步递归方法中的回调?

转载 作者:行者123 更新时间:2023-12-03 06:01:22 25 4
gpt4 key购买 nike

对于我正在做的一个项目,我有一个函数可以根据文件及其内容构建树模型。我的解析文件函数是递归的,并且将继续调用其自身,直到它无法深入目录树/命中不包含更多文件的文件。但是我不知道如何为此函数设置回调,因为它是递归的。截至目前,我只是让我的构造树方法超时,但这对我的问题来说是一个可怕且不可靠的解决方案。这是我的代码:

function constructTree(dir){
tree = new TreeModel()
root = tree.parse({name: 'Marshall McGee Sample Pack'});
parseFiles(dir, root, tree);
setTimeout(function(){
root.all().forEach(function(node){
console.log(node.model.name);
});
}, 1000)
}

function parseFiles(dir, parrent, tree){
fs.readdir(dir, function(err, files){
if(files){
for(i = 0; i < files.length; i++){
parrent.addChild(tree.parse({name: files[i]}));
console.log(files[i]);
parseFiles(dir + "/" + files[i], parrent, tree);
}
}
});
}

这段代码“有效”,但是很糟糕。我不知道如何确定我是否搜索了整个目录,也不知道如何正确执行此操作。我希望我解释得很好!谢谢并提供任何帮助!!!

最佳答案

您应该向您的 parseFiles 函数添加一个回调参数,并让它在完成工作后(异步)调用该回调。

为了知道某个文件夹中的所有项目何时被遍历,您应该保留一个计数,并且只有当最后一个项目完成时,才通知调用者(通过他提供的回调)该部分的树已完成(请参阅 count 变量):

function constructTree(dir){
var tree = new TreeModel()
var root = tree.parse({name: 'Marshall McGee Sample Pack'});
// instead of timer, pass a callback function that should be called
// when the whole tree has been loaded.
parseFiles(dir, root, tree, function () {
root.all().forEach(function(node){
console.log(node.model.name);
});
});
}

function parseFiles(dir, parrent, tree, done){
fs.readdir(dir, function(err, files){
// Only proceed here when there is at least one file (added condition)
if(files && files.length){
// keep track how many items still need to be collected:
var count = files.length;
for(var i = 0; i < files.length; i++){
parrent.addChild(tree.parse({name: files[i]}));
console.log(files[i]);
parseFiles(dir + "/" + files[i], parrent, tree, function () {
count--;
// if we have all items (recursively) added to the tree, notify the caller
if (!count && done) done();
});
}
} else {
// If no information in this folder, notify caller immediately
if (done) done();
}
});
}

由于调用者没有义务传递回调,因此代码必须在调用之前检查 done 的值。这就是为什么有 if (done) did()

注意:与您的问题无关,但您应该注意使用 var 关键字(或 letconst)以避免不必要的全局变量的创建。

关于javascript - 异步递归方法中的回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39737043/

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