【新手求助】nodejs 异步操作问题
发布于 12 年前 作者 cckowin 4595 次浏览 最后一次编辑是 8 年前

数据库表um_department:

CREATE TABLE `um_department` (
  `deptid` int(11) NOT NULL AUTO_INCREMENT,     //部门id
  `dept` varchar(64) NOT NULL DEFAULT '',       //部门名字
  `dupid` int(11) DEFAULT '0',                  //上级部门id,dupid=0表示此部门为顶级部门
  `deptshow` varchar(127) DEFAULT '',           //部门信息
  PRIMARY KEY (`deptid`)
) ENGINE=MyISAM AUTO_INCREMENT=74 DEFAULT CHARSET=gbk;

现在要查出整个部门树的结构,返回下面这样的数据

[{deptid:1, dept: '部门1', dupid:0, deptshow: '',  deptlist: [{deptid:2, dept: '部门2', dupid:1, deptshow: ''}, {deptid:3, dept: '部门3', dupid:1, deptshow: ''}]}]

用的mysql数据查询模块是nodejs-mysql-native,我发现我写的时候还是同步的思维,不正确,代码如下:

var deptlist = [];
db.query("SELECT * from um_department where dupid='0'")
    .on("row", function(r) {
        r.deptlist = getDeptList(r.deptid);
        deptlist.push(r);
    })
    .on("end", function(r) {
        console.log(deptlist);
    });
function getDeptList(deptid) {
    var deptlist = [];
    db.query("SELECT * from um_department where dupid = '" +  deptid + "'")
        .on("row", function(r) {
            r.deptlist = getDeptList(r.deptid);
            deptlist.push(r);
        })
        .on("end", function(r) {
            return deptlist;
        });
}

请问如何正确的实现这个功能啊

2 回复

当然不行拉,一定要用异步的思维。 将异步的函数嵌套在异步函数中,例如

db.select('xxxxxx').exec(function(err,doc){
    //查询出最高级部门doc
    db.select('根据doc查出其下子部门').exec(function(err,docs){
        doc.list = docs;
        console.dir(doc);
    });
});

这只是一个简单的例子,不是用的mysql模块,大概意思就是让你嵌套。 另外你这个数据库设计和查询有2个你思考一下: 1.如果你的顶级部门很多怎么办,你这里只是查的一个 2.如果你的部门嵌套很深有多级怎么办,你这里只有两级 如果把这两种情况考虑进去,你再设计下你的查询看看

可以用wind.js用同步思维写异步代码

回到顶部