2015-07-01 31 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?