web-dev-qa-db-fra.com

renvoyer les résultats d'une fonction (javascript, nodejs)

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?

22
profesoralex
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

44
Raynos

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

11
Simone Gianni