Возвращать результаты из функции (javascript, nodejs)
Может ли кто-нибудь помочь мне с этим кодом? Мне нужно вернуть форму значения функции 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
. Может ли кто-нибудь помочь мне с этим кодом?
Ответы
Ответ 1
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);
});
Вам нужно использовать обратные вызовы. Это как работает асинхронный ввод-вывод. Btw sys.puts
устарел
Ответ 2
Вы пытаетесь выполнить an asynchronous function
синхронно, что, к сожалению, not possible in Javascript
.
Как вы правильно догадались, roomId=results
.... выполняется, когда загрузка из БД завершается, что выполняется асинхронно, поэтому ПОСЛЕ восстановления вашего кода завершено.
Посмотрите на эту статью, она говорит о .insert and not .find
, но идея одинаков: http://metaduck.com/01-asynchronous-iteration-patterns.html