从一个函数返回结果(JavaScript,Node.js)

22

有人可以帮我修改这段代码吗? 我需要从routeToRoom函数中返回一个值:

var sys = require('sys');

function routeToRoom(userId, passw) {
    var roomId = 0;
    var nStore = require('nstore/lib/nstore').extend(require('nstore/lib/nstore/query')());
    var users = nStore.new('data/users.db', function() {

        users.find({
            user: userId,
            pass: passw
        }, (function(err, results) {
            if (err) {
                roomId = -1;
            } else {
                roomId = results.creationix.room;
            }
        }
        ));
    });
    return roomId;
}
sys.puts(routeToRoom("alex", "123"));

但我总是得到:0

我猜想return roomId;roomId = results.creationix.room之前执行。能否有人帮助我解决这个代码问题?

2个回答

44
function routeToRoom(userId, passw, cb) {
    var roomId = 0;
    var nStore = require('nstore/lib/nstore').extend(require('nstore/lib/nstore/query')());
    var users = nStore.new('data/users.db', function() {
        users.find({
            user: userId,
            pass: passw
        }, function(err, results) {
            if (err) {
                roomId = -1;
            } else {
                roomId = results.creationix.room;
            }
            cb(roomId);
        });
    });
}
routeToRoom("alex", "123", function(id) {
    console.log(id);    
});

你需要使用回调函数(callbacks),这是异步I/O工作的方式。顺便说一句,sys.puts已经被弃用(deprecated)。


存在这样的格式吗?var roomId = takeRoom(“alex”,“123”);我的问题是我需要将结果保存到“全局”变量中,以便在其他函数中使用。谢谢! - profesoralex
1
@profesoralex,你做错了。重写你的代码吧。Node是异步的。学会异步编程吧。 - Raynos

11
你试图以同步方式执行异步函数,这在JavaScript中不可能实现。
如你所猜测的那样,当从数据库加载完成后,roomId=results会被执行,加载是异步完成的,因此在代码的其余部分完成之后才会执行。
查看这篇文章,它谈论的是.insert而不是.find,但是思路相同:http://metaduck.com/01-asynchronous-iteration-patterns.html

谢谢您的回复,Andrzej!链接http://metaduck.com/post/2675027550/asynchronous-iteration-patterns-in-node-js无法访问,您有其他来源吗?谢谢! - profesoralex
1
我刚刚重新格式化了你的问题;Simone提供了这个答案(你可以从右边的名字,就在这些评论上方看到)。 - Andrzej Doyle
奇怪,从这里看起来它是工作的...不过,在谷歌上搜索“nodejs异步模式”,你会找到一些文章。 - Simone Gianni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接