问题线程函数执行nodejs / redis

我有一个很大的问题执行我的程序。 我们使用redis hkey并testing这个密钥是否存在

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.hexists(… function(err,rep){})中的variables标记[k]总是等于表的最后一个值?

谢谢你的帮助

文森特

这是因为client.hexists是asynchronous的,所以当callback执行时,for循环已经完成。 解决这个问题的最简单的方法是打破这个function:

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

这就是说,我不确定你为什么要这么做? 你可以hgethget起来,你会得到null或值。