nodejs的函数返回值
发布于 11 年前 作者 sunuxreg 31296 次浏览 最后一次编辑是 8 年前

难道nodejs中的return语句跟c里边的不一样吗?这样:我在一个js文件中写了个函数,用来返回数据库打开后的db对象,内容如下:

console.log("In file db.js")  ;
var mongodb=require('mongodb')
, mongoserver=new mongodb.Server('localhost',27017)
,dbweibo=new mongodb.Db('weibo',mongoserver,{w:-1});
function openedDb(){
console.log("in openedDb function")
 if(dbweibo.serverConfig.connected)
 return dbweibo.db;
 else{
     dbweibo.open(function(err,db){
         if(err)
         return "open db failed";
         else {// console.log(db);
         return db; }
        })
     }
}
module.exports.openedDb=openedDb;

你能看到,在最后一个return语句之前有个log语句,这时显示的内容还是一个极其复杂的db对象。 然后我在routes文件中这样写

var db=openedDb();
console.log(db);

但是这回得到的db确实undefined,我就奇怪了,return之前还是正常的db对象,怎么return之后变成undefined了?难道nodejs的return语句与java和c的return语句不通?他不应该返回那个正常的db对象吗?

14 回复

贴代码的格式有误… 楼主编辑一下吧, Markdown 语法注意一下, 只能这么说了 JS 的 return 因为是在回调函数里执行, 已经不是正常的顺序了 况且 return 也不可能隔着两层函数还能 return 回数据吧

一般按回调函数的逻辑,

var db=openedDb();
console.log(db);

是先执行第一行, 再执行第二行, 但是中间一个回调函数, 比如 IO 操作其实还没执行 所以 console.log 执行的时候, 回调函数还没执行, 所以就没有返回值 等到数据库返回数据之后, return 的内容也就没有被捕获了

说的对啊,这个return在回调函数里不可能将return的只作为openedDb的返回值。那要怎么才能正确得到这个db对象呢?这个异步特性带来的流程控制还真是麻烦啊。

一般是放个函数(马仔)近来,干完了事让马仔把东西带走。

这个是异步回调函数里返回的db对象

还是在用阻塞的思路写Node,该换换思路了

哦,类似于回调函数是吗?

刚开始学习的时候感觉不是很难,但是真的做起东西来就感觉这个异步思想还真不是一时半会能变过来的。

@sunuxreg 我也在经历这样的变化,顺序的程序流程,在这里不适合了。在这方面可以理解为颠覆式的变化。

返回值可以在回调函数里面获取,反正只要记好一点,这里面是异步的,它稀里哗啦搞定了,才会调用回调函数

写的麻烦 db一直打开不可以么

我是想,如果打开必然要用到open语句,open语句写在程序中,每次用户访问又会执行open语句,这样的话每次都要打开数据库。

@sunuxreg 用 Node 只能把后续的步骤写在回调函数里被继续调用和执行了 可以用 promise, generator 之类方式弄更习惯的写法, 那要看更多东西 当然现在我觉得回调的 CPS 还是能接受的

@jiyinyiyong 嗯,我用回调函数试试

回到顶部