2016-08-19 12 views
1

私は解決策を見つけることができない問題に夢中になります。私はredisクエリから値を返すことはできません。私はNode.JSのredisドライバとしてnode_redisクライアント(http://redis.js.org/)を使用しています。node_redis client - クエリから値を返すことができません

問題は次のとおりです。ユーザーステータス接続を取得して他の関数の値を取得するための関数を作成しました。

//CHECK USER STATUS 
exports.checkUserStatus = function(uid){ 
    redis.multi() 
     .sismember('users:online',uid) 
     .sismember('users:iddle', uid) 
     .sismember('users:out', uid) 
     .sismember('users:locked', uid) 
     .exec(function(err, res){ 
      res.forEach(function(res, index){ 
       if(res != 0){ 
        switch(index){ 
         case 0: 
          return 'online'; 
          break; 
         case 1: 
          return 'iddle'; 
          break; 
         case 2: 
          return 'out'; 
          break; 
         case 3: 
          return 'locked'; 
          break; 
         default: 
          return 'offline'; 
        } 
       } 
      }); 
     }) 
} 

しかし、関数は何も返しません!私が返す行をconsole.log()に置き換えると、うまくいきます!しかし、私はconsole.log()を必要としません、私は値を取る必要があります。

私はクエリの外部で変数を作成して内部から設定して返しますが、機能しません。

どうすればいいですか?

ありがとうございました!

答えて

0

このサイトでは、スペイン語で正解を受けました。私は他の人に助けを求めてここに投稿:

//CHECK USER STATUS ... Take a look at the new parameter 'callback' in the function! 

exports.checkUserStatus = function(uid, callback){ 
    redis.multi() 
     .sismember('users:online',uid) 
     .sismember('users:iddle', uid) 
     .sismember('users:out', uid) 
     .sismember('users:locked', uid) 
     .exec(function(err, res){ 
      res.forEach(function(res, index){ 
       if(res != 0){ 
        switch(index){ 
         case 0: 
          // Here invoke the user's function 
          // and I pass the info 
          callback('online'); 
          break; 
         case 1: 
          callback('online'); 
          break; 
         case 2: 
          callback('online'); 
          break; 
         case 3: 
          callback('locked'); 
          break; 
         default: 
          callback('offline'); 
        } 
       } 
      }); 
     }) 
} 

そして、あなたは以下を参照してくださいますよう、私は返された値をキャッチ:

// sequence of events 
// This happend first - #1 
checkUserStatus('uid-12343', function(status, user) { 
    // This happend at the end - #2 
    // Here we catch the status in asynchronous way 
}); 

// This happend second - #2 
console.log("This happend before the redis info arrive!"); 

はみんなにありがとう!私は助けてくれることを願っています!

0

私は赤ちゃんの専門家ではありませんが... returnというキーワードが不足している可能性がありますか?

var result; 
exports.checkUserStatus = function(uid){ 
    redis.multi() 
    ... 
    .exec(function(err, res){ 
     res.forEach(function(res, index){ 
      if(res != 0){ 
       switch(index){ 
        case 0: 
         result = 'online'; 
         break; 
        case 1: 
         result ='iddle'; 
         break; 
        case 2: 
         result = 'out'; 
         break; 
        case 3: 
         result = 'locked'; 
         break; 
        default: 
         result = 'offline'; 
       } 
      } 
     }); 
    }) 
    return result; 
} 

http://redis.io/commands/MULTIのマニュアルに基づいていますが、返さないでください。

+0

はい!作業!私はとても疲れているかどうかわからない、あなたのコードを確かに試してみると、それはうまくいくが、私はすでにそれを試していたと断言できた。 –

関連する問題