执行我的程序时遇到了很大的问题。 我们使用redis hkey并测试该密钥是否存在
hgetall tags
"X5"
"6"
"X2"
"7"
这是该计划:
function firstChoiceChannel(){
var i=0;
var listRep
console.log(tags);
for(var k in tags){
console.log('@'+k+'|'+tags[k]);
client.hexists('tags',tags[k],function(err,rep){
console.log(tags[k]+"=>"+k+' i '+rep)
if(rep===1){
client.hget('tags',tags[k],function(err,rep){
console.log('value:'+rep);
})
console.log('ok');
}
});
}
}
这是控制台中的执行程序
[ 'X1', 'X2', 'X3', 'X5' ]
@0|X1
@1|X2
@2|X3
@3|X5
X5=>3 i 0
X5=>3 i 1
ok
X5=>3 i 0
X5=>3 i 1
ok
value:7
value:7
为什么变量标签[k]在子函数client.hexists(... function(err,rep){})中 总是等于表的最后一个值?
感谢您的帮助
文森特
答案 0 :(得分:2)
这是因为client.hexists
是异步的,所以当回调执行时,for循环已经完成。解决这个问题的最简单方法是打破这个功能:
function getIfExists(tag) {
client.hexists('tags', tag, function(err,rep) {
if(rep===1){
client.hget('tags',tag,function(err,rep) {
console.log('value:'+rep);
});
}
});
}
此外,javascript的for... in...
语法不适用于数组。
for(var i = 0, len = tags.length; i < len; i++) {
getIfExists(tags[i]);
}
或者您可以使用Array.prototype.forEach
:
tags.forEach(getIfExists);
那就是说,我不确定你为什么要做hexists
?您可以hget
它,您将获得null
或价值。