2017-04-10 11 views
0

私は、ユーザーのオンライン/オフライン状態を追跡するためにsocket.io、redisを使用しています。ここでは、名前としてno.ofユーザーをキーhub_idでキーとして保管しています。私はちょうどhub_パターンに一致するキーの数を取得することによってユーザーの数を得ることができます。これで、キーはオンラインまたはオフラインのステータスとして価値を持ちます。redis、nodejsを使ってオンライン/オフラインユーザー数を調べる

私はいいえを得ることができません。 forループの外側にあるオンラインまたはオフラインの変数。

app.get('/test', function(req, res) { 
    client.keys('hub*', function (err, keys) { 
    console.log(keys.length); 
    for (var i=0; i<keys.length; i++){ 
    client.hgetall(keys[i], function(err, reply) { 
    if(reply.status == "online"){ 
     onlinehub++; 
    } 
    else if(reply.status == "offline"){ 
     offlinehub++; 
    } 
    }); 
    } 
    console.log(onlinehub +"-" +offlinehub) 

    }); 
}); 
+0

ノートからの助けを取ることができます - あなたのハッシュが大きい場合これはしばらく時間がかかる可能性があります。代わりに、オフライン/オンライン/あらゆるユーザーのカウンター(Redisで)を保持して、1回の読み取り操作で返信を受け取ることができます。 –

答えて

0

これらの変数は

client.hgetall(keys[i], function(err, reply) { //<-- this is callback function 
if(reply.status == "online"){ 
    onlinehub++; 
} 
else if(reply.status == "offline"){ 
    offlinehub++; 
} 
console.log(onlinehub +"-" +offlinehub); //Put the log here and check if it is giving correct numbers? 
}); 

すなわち、非同期関数呼び出しに更新されるので、ここでは、forループonlinehubofflinehub外にアクセスすることはできませんので、あなたがonlinehubofflinehubの更新された値にのみアクセスすることができますですその非同期コールバック関数内の変数。今すぐあなたのコンソールにログとして0-0を取得している必要があります。この問題を解決するには

あなたは以下のコード

app.get('/test', function(req, res) { 
    //Defined a callback function to know when counting on redis keys finished 
    var onComplete = function() { 
     console.log(onlinehub+"-"+offlinehub); 
    }; 
    client.keys('hub*', function (err, keys) { 
     console.log(keys.length); 
     var taskToGo = keys.length; 
     if(taskToGo==0){ 
      onComplete(); 
     }else{ 
      for (var i=0; i<keys.length; i++){ 
       client.hgetall(keys[i], function(err, reply) { 
        if(reply.status == "online"){ 
        onlinehub++; 
        } 
        else if(reply.status == "offline"){ 
         offlinehub++; 
        } 
        //Added this line 
        if(--taskToGo==0){ 
        onComplete(); 
        } 
       }); 
      } 
     } 
    }); 
}); 

に見ることができ、それが実行している間は、 `HGETALL`ブロックサーバーというasync for loop in node.js

関連する問題