有人可以帮我这个代码吗?我需要从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
之前执行。有人可以帮我这个代码吗?
答案 0 :(得分: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);
});
您需要使用回调。这就是异步IO的工作原理。顺便说一句sys.puts
已被弃用
答案 1 :(得分:11)
您尝试以同步方式执行an asynchronous function
,不幸的是not possible in Javascript
。
正如您所猜测的那样,当数据库的加载完成时,roomId=results
....将被执行,这是异步完成的,所以在完成代码的完成之后。
看看这篇文章,它谈到.insert and not .find
,但想法是一样的:http://metaduck.com/01-asynchronous-iteration-patterns.html