这是在 Java 中完成的超级简单的任务,但是 javascript 的异步特性使得这个任务(对我来说)几乎是不可能的,至少就我现在的知识而言。(我不是在尝试 bash javascript。喜欢这种语言!)。
这是非常基本的。在我的 mysql 数据库中,顶级树的父级为 null。找孩子很容易。孩子们有可用的线路。树的深度是可变的。
private static Set<Tree> getBranches( Tree trunk ) {
Set<Tree> treeSet = new HashSet<Tree>();
if ( trunk != null ) {
if ( trunk.hasLines() ) { //queries if tree has lines. returns true or false
treeSet.add( trunk );
}
for ( Tree tree : trunk.treeList ) {
treeSet.addAll( getBranches( tree ) );
}
}
return treeSet;
}
基本上,该方法测试树是否有可用的行。如果是这样,它将所有这些添加到一个集合中。如果没有,它会继续,直到找到行。
mysql 节点库的异步特性将这个任务变成了地狱。
这是我现在拥有的
function hasLines(tree_id, callback) {
var ret;
pool.query('SELECT * from pkg_line_tree where tree_id = ?', [tree_id], function (err, rows) {
if (rows.length > 0) {
ret = true;
} else {
ret = false;
}
callback(ret);
});
}
function dig(tree_id, treeArray, callback) {
pool.query('SELECT * from tree where parent_id = ?', [tree_id], function (err, rows) {
if (rows) {
for (var i in rows) {
hasLines(rows[i].tree_id, function (t) {
if (t) {
treeArray.push(rows[i].tree_id);
} else {
treeArray.concat(dig(rows[i].tree_id, treeArray));
}
});
}
if (callback) {
callback(treeArray);
}
}
});
return treeArray;
}
var treeArray = [];
dig(52, treeArray, function (t) {
res.json(t);
});
我真的只需要输出这个根树中所有可用的孩子。
如果这没有意义,请告诉我。我会尝试重构。我希望我能理解某种观点。我不想使用像 Fibers 这样的东西来完成这项工作,但我别无选择。谢谢。