Javascript 问题线程函数执行节点JS/redis
我在执行我的程序时遇到了一个大问题。 我们使用redis hkey并测试该密钥是否存在Javascript 问题线程函数执行节点JS/redis,javascript,node.js,redis,Javascript,Node.js,Redis,我在执行我的程序时遇到了一个大问题。 我们使用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]);
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
为什么子函数client.hexsts(…函数(err,rep){})中的变量标记[k]
是否始终等于表的最后一个值
谢谢你的帮助
vincent这是因为
client.hexsts
是异步的,所以当回调执行时,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(var i = 0, len = tags.length; i < len; i++) {
getIfExists(tags[i]);
}
也就是说,我根本不知道你为什么要做《六边形》?你可以只
hget
it,你会得到null
或值。你怎么认为它的函数是异步的(没有测试)?任何函数如果不返回它的答案,而是接受用答案调用的回调,那么它(很可能)是异步的。对于这类事情来说,它是一个非常好的控制流库。
tags.forEach(getIfExists);