2015-07-01 36 views
0

我对异步世界颇为陌生。在使用任何库之前,我都会首先尝试使用回调来完成所有任务。我想我有一个关闭问题,但不知道该怎么做。socket.io - 从匿名函数内发射

下面是一些代码:

namespace.on('connection', function(socket){ 
    var newClient = socket.id//just in case the a new user logged on between declaration and use 
    socket.join('room1') 
    function newConnection(positionCallback, hashCallback, newUser){ 
     namespace.to(socket.id).emit('hello', {yo:'works'}) 
     for(var i=0; i< cardCounter ;i++){ 
      var keyVal = 'card:'+ cardArray[i] 
      redis.hgetall(keyVal, function (err, storedMsg) { 
        namespace.to(socket.id).emit('hello', {yo:'doesnt work'}) 
        hashCallback(storedMsg, newUser) 
       }); 
      if(i==cardCounter-1){ 
       positionCallback() 
      } 
     } 
    } 

    function onConnectionComplete(){ 
     namespace.to(socket.id).emit('hello', {yo:'works'}) 
    } 

    function onHashComplete(hashObject, newUser){ 
     namespace.to(newUser).emit('hello', {yo:'doesnt work'}) 
    } 

    newConnection(onConnectionComplete, onHashComplete, newClient) 
} 

我已经把一些socketio发出周围准确判断出问题的地方。

任何在redis调用之外发出的按照预期工作。只要我进入那个匿名函数 - nada。

这就是说,我有console.log()'该函数内的一切。我从redis获得正确的结果,我拥有合适的用户,并且定义了命名空间。

我只是不能发出结果。

我原以为匿名函数可以访问它外面的范围 - 但不是相反。我不明白什么是不能通过...

另外我知道有些人不喜欢if语句来调用回调,但这可能是另一天的讨论。

回答

0

这是一个关闭问题!只是不是我期待的。

我也是,啊哈,真的不明白。

回调不是问题,在redis响应函数中获取变量是可访问的。我会认为在父/祖先函数中声明的任何变量都可用于子/继承函数。

在这个例子中,我需要在循环内部创建一个函数,并明确地传递变量使其在闭包内可用。

这里是计算器疑问,我指出了正确的方向:

How can I access the key passed to hgetall when using node_redis?