我因为一个无法找到解决方案的问题而疯狂。我无法从redis查询中返回值。我使用node_redis客户端(http://redis.js.org/)作为Node.JS的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 :(得分: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多重返回值的手动,您不会返回。
答案 1 :(得分: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!");
谢谢大家!我希望我能帮助你!