Подтвердить что ты не робот

Возвращать результаты из функции (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. Может ли кто-нибудь помочь мне с этим кодом?

4b9b3361

Ответ 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