2016-08-19 98 views
1

我疯了一个问题,我找不到解决方案。我无法从redis查询中返回值。我使用node_redis客户端(http://redis.js.org/)作为Node.JS的redis驱动程序。node_redis客户端 - 无法从查询中返回值

问题是:我写了一个获取用户状态连接的函数,并将其返回以从其他函数获取值。

//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

我不是redis专家,但是......也许你只是错过了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

是的!工作!我不知道我是否很累或什么,我尝试你的代码只是为了确保它的工作,但我可以发誓我已经尝试过......非常感谢! –