Javascript 问题线程函数执行节点JS/redis

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]);

我在执行我的程序时遇到了一个大问题。 我们使用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
为什么子函数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);