【新手求助】nodejs 异步操作问题 - CNode技术社区

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

数据库表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用同步思维写异步代码

回到顶部

AltStyle によって変換されたページ (->オリジナル) /