问题线程函数执行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);
这就是说,我不确定你为什么要这么做? 你可以hget
它hget
起来,你会得到null
或值。