2011-08-31 46 views
20

谁能帮我这个代码?我需要返回一个值形成routeToRoom功能:返回的结果从一个函数(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")); 

但我总是得到:0

我猜return roomId;roomId=results.creationix.room之前执行。有人可以帮我解决这个问题吗?

回答

9

您正在尝试以同步的方式,这是不幸not possible in Javascript执行an asynchronous function

正如你猜对的那样,roomId=results ....在从数据库加载完成时执行,这是异步完成的,所以在完成代码的恢复后。

看一下这篇文章,它谈论.insert and not .find,但这个想法是一样的:http://metaduck.com/01-asynchronous-iteration-patterns.html

+0

感谢您的答复,安杰伊!链接http://metaduck.com/post/2675027550/asynchronous-iteration-patterns-in-node-js不工作,你有另一个来源?谢谢! – profesoralex

+1

我刚刚重新格式化了你的问题; Simone提供了这个答案(你可以从右边的名字中看到,就在这些注释之上)。 –

+0

奇怪,它的工作从这里开始。然而,在谷歌搜索的“异步的NodeJS模式”,你会发现一些文章。 –

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

您需要使用回调。这就是异步IO的工作原理。顺便说一句sys.puts已被弃用

+2

超凡!它工作正常,我已经学会了如何使用回调。 – profesoralex

+0

是否存在这样的格式?var roomId = takeRoom(“alex”,“123”);我的问题是我需要将结果保存到“全局”变量中以在其他函数中使用它。谢谢! – profesoralex

+1

@profesoralex你做错了。重写你的代码。节点是异步的。学习写入异步。 – Raynos

相关问题