任务是在node.js中递归构建树结构。也就是说,我使用一副幻灯片,可能还包括其他子甲板。我是函数式编程的新手,我不知道自己需要做什么。我知道,有更多高级方法来控制流程,但我想在开始时尝试以嵌套方式执行,如果可能的话。我现在拥有的:
server.js调用api并使用json对象进行响应:
router.get('/deck/tree/:rev_id', function(req, res) {
var Deck = require('./models/deck');
var deck = new Deck(connection);
deck.getTree(req.params.rev_id ,function (tree) {res.json(tree)});
});
在甲板模块中我有几个功能: 2.a获得牌组标题的功能:
this.getTitle = function(rev_id, callback){
var sql = "SELECT title FROM ?? WHERE ?? = ?";
var inserts = ['deck_revision', 'id', rev_id];
sql = mysql.format(sql, inserts);
connection.query(sql, function(err, results) {
if (err) throw err;
callback(results[0].title);
});
};
2.b获得"直接"的功能甲板上的孩子们:
this.getChildren = function(acc, callback){
acc.children = [];
var sql = "SELECT item_id AS id, item_type AS type FROM ?? WHERE ?? = ? ORDER BY position";
var inserts = ['deck_content', 'deck_revision_id', acc.id];
sql = mysql.format(sql, inserts);
connection.query(sql, function(err, results) {
if (err) throw err;
results.forEach(function(res_item){
acc.children.push({'id': res_item.id, 'type': res_item.type});
if (acc.children.length === results.length){
callback(acc);
}
});
});
};
应该补充树的功能(暂时不起作用):
var results = [];
this.getTree = function(id, callback) {
var acc = {};
var deck = this;
var new_slide = new Slide(connection);
deck.getTitle(id, function (title_str) {
acc.title = title_str;
acc.id = id;
acc.type = 'deck';
deck.getChildren(acc, function(new_acc){
new_acc.children.forEach(function(element){
if (element.type === 'deck'){
// I suppose the help is needed here!
deck.getTree(element.id, function(new_element){
results.push(new_element);
if(results.length === new_acc.children.length) {
callback(results);
}
});
}else{
new_slide.getTitle(element.id, function(title_str){
element.title = title_str;
results.push(element);
if(results.length === new_acc.children.length) {
callback(results);
}
});
}
答案 0 :(得分:0)
如果有人感兴趣,请点击此处我的工作原理:
this.getChildren = function(id, callback){
var sql = "SELECT item_id AS id, item_type AS type, position FROM ?? WHERE ?? = ? ORDER BY position";
var inserts = ['deck_content', 'deck_revision_id', id];
sql = mysql.format(sql, inserts);
connection.query(sql, function(err, results) {
if (err) throw err;
callback(results);
});
};
this.getTree = function(id, acc, callback) {
deck = new Deck(connection);
var new_slide = new Slide(connection);
deck.getTitle(id, function (title_str) {
acc.title = title_str;
acc.id = id;
acc.type = 'deck';
acc.children = [];
deck.getChildren(acc.id, function(children){
children.forEach(function(element){
if (element.type === 'deck'){
deck.getTree(element.id, element, function(new_element){
acc.children[new_element.position - 1] = new_element;
var size = acc.children.filter(function(value) { return value !== null }).length;
if (size === children.length){
callback(acc);
}
});
}
else{
new_slide.getTitle(element.id, function(title_str){
element.title = title_str;
acc.children[element.position - 1] = element;
var size = acc.children.filter(function(value) { return value !== null }).length;
if(size === children.length) {
callback(acc);
}
});
}
});
});
});
};