我正在使用socket.io,redis来跟踪用户的在线/离线状态。在这里,我将使用模式hub_id存储名称为key的no.of用户。我只需获得与hub_ pattern匹配的键数就可以获得用户数。现在,密钥具有在线或离线状态的价值。
我无法得到否。用户在线或离线变量在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 :(得分:0)
在这里,您无法访问onlinehub
和offlinehub
外部for循环,因为这些变量在异步函数调用中更新,即
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?
});
因此,您只能在该异步回调函数中访问onlinehub
和offlinehub
变量的更新值。现在,您必须在控制台上登录 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();
}
});
}
}
});
});
获取帮助