2011-08-31 13 views
20

Czy ktoś mógłby mi pomóc z tym kodem? Muszę zwrócić wartość tworzą funkcję routeToRoom:zwraca wyniki funkcji (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")); 

Ale mam zawsze: 0

Chyba return roomId; jest wykonywany przed roomId=results.creationix.room. Czy ktoś mógłby mi pomóc z tym kodem?

Odpowiedz

9

Próbujesz wykonać an asynchronous function w sposób synchroniczny, który jest niestety not possible in Javascript.

Jak odgadłeś poprawnie, roomId=results .... jest wykonywany, gdy ładowanie z DB kończy się, co jest wykonywane asynchronicznie, więc po resto kodu jest zakończona.

Spójrz na tego artykułu mówi o .insert and not .find, ale idea jest ta sama: http://metaduck.com/01-asynchronous-iteration-patterns.html

+0

dziękuję za odpowiedź, Andrzej! Link http://metaduck.com/post/2675027550/asynchronous-iteration-patterns-in-node-js nie działa, czy masz inne źródło? Dzięki! – profesoralex

+1

Właśnie sformatowałem twoje pytanie; Simone dostarczył tę odpowiedź (możesz powiedzieć od nazwiska po prawej, tuż nad tymi komentarzami). –

+0

Dziwne, działa stąd ... jednak szukaj w google dla "asynchronicznych wzorców nodejs", znajdziesz kilka artykułów. –

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

trzeba użyć wywołania zwrotne. Tak działa asynchroniczne IO. Btw sys.puts jest przestarzałe

+2

Doskonała !!!! Działa poprawnie i nauczyłem się korzystać z wywołań zwrotnych. – profesoralex

+0

Czy istnieje taki format? Var roomId = takeRoom ("alex", "123"); Mój problem polega na tym, że muszę zapisać wynik w zmiennej "globalnej", aby użyć go w innych funkcjach. Dziękuję Ci! – profesoralex

+1

@profesoralex robisz to źle. Przepisz swój kod. Węzeł jest asynchroniczny. Naucz się pisać asynchronicznie. – Raynos

Powiązane problemy