Quelqu'un pourrait-il m'aider avec ce code? J'ai besoin de renvoyer une valeur d'une fonction 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"));
Mais je reçois toujours: 0
J'imagine return roomId;
est exécuté avant roomId=results.creationix.room
. Quelqu'un pourrait-il m'aider avec ce code?
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);
});
Vous devez utiliser des rappels. Voilà comment fonctionne asynchrone IO. Btw sys.puts
est obsolète
Vous essayez d'exécuter an asynchronous function
de manière synchrone, ce qui est malheureusement not possible in Javascript
.
Comme vous l'avez bien deviné, le roomId=results
.... est exécuté lorsque le chargement à partir de la base de données est terminé, ce qui se fait de manière asynchrone, donc APRÈS le resto de votre code est terminé.
Regardez cet article, il parle de .insert and not .find
, mais l'idée est la même: http://metaduck.com/01-asynchronous-iteration-patterns.html