2011-08-31 12 views
20

¿Alguien podría ayudarme con este código? Tengo que devolver un valor formar una función routeToRoom:devuelve resultados de una función (javascript, nodejs)

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")); 

Pero consigo siempre: 0

supongo return roomId; se ejecuta antes de roomId=results.creationix.room. ¿Alguien podría ayudarme con este código?

Respuesta

9

Está intentando ejecutar an asynchronous function de forma síncrona, que desafortunadamente es not possible in Javascript.

Como adivinó correctamente, roomId=results .... se ejecuta cuando finaliza la carga de la base de datos, que se realiza de forma asíncrona, por lo que DESPUÉS se completa el resto de su código.

vistazo a este artículo, se habla de .insert and not .find, pero la idea es la misma: http://metaduck.com/01-asynchronous-iteration-patterns.html

+0

gracias por su respuesta, Andrzej! El enlace http://metaduck.com/post/2675027550/asynchronous-iteration-patterns-in-node-js no funciona, ¿tiene otra fuente? ¡Gracias! – profesoralex

+1

Acabo de volver a formatear su pregunta; Simone proporcionó esta respuesta (se puede ver por el nombre a la derecha, justo encima de estos comentarios). –

+0

extraño, está funcionando desde aquí ... sin embargo, busque en google "nodejs asynchronous patterns", encontrará algunos artículos. –

38
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);  
}); 

Es necesario utilizar devoluciones de llamada. Así es como funciona el IO asíncrono. Btw sys.puts está en desuso

+2

¡Excelente! Funciona correctamente y aprendí cómo usar devoluciones de llamada. – profesoralex

+0

¿Existe un formato como ese? Var roomId = takeRoom ("alex", "123"); Mi problema es que debo guardar un resultado en una variable "global" para usarlo en otras funciones. ¡Gracias! – profesoralex

+1

@profesoralex estás haciendo mal. Reescribe tu código. El nodo es asincrónico. Aprende a escribir de forma asincrónica. – Raynos

Cuestiones relacionadas