2012-03-14 60 views
1

我有执行我的程序很大的问题。 我们使用Redis的HKEY和测试,如果该键存在问题线程函数执行nodejs/redis

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){}) 总是等于表的最后一个值?

感谢您的帮助

文森特

回答

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

+0

它只是测试;)非常感谢 – Vsplit 2012-03-14 10:43:18

+0

你认为它的功能是异步的(没有测试)? – Vsplit 2012-03-14 20:41:43

+0

任何函数都不会返回它的答案,而是需要一个与答案一起调用的回调函数,(很可能)是异步的。 ['async'](https://github.com/caolan/async)对于这些事情来说是一个非常好的控制流程库。 – 2012-03-15 10:56:55