问题线程函数exection nodejs / redis

时间:2012-03-14 08:25:02

标签: 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]);
            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){})中 总是等于表的最后一个值?

感谢您的帮助

文森特

1 个答案:

答案 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或价值。