2012-03-14 7 views
1

私のプログラムを実行するには大きな問題があります。 私たちは、このキーは問題スレッド機能の除外nodejs/redis

hgetall tags 
"X5" 
"6" 
"X2" 
"7" 

を存在する場合、このプログラムでRedisのHKEYとテストを使用します。

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){}) は常にtableの最後の値と同じですか?あなたの助けのための

おかげ

ヴィンセント

答えて

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

また、ジャバスクリプトのfor... in...構文は配列のために最適ではない。この問題を解決する最も簡単な方法は、関数を抜け出すことです。

for(var i = 0, len = tags.length; i < len; i++) { 
    getIfExists(tags[i]); 
} 

それとも、Array.prototype.forEach使用することができます言っ

tags.forEach(getIfExists); 

、私はあなたがすべてでhexistsを行う理由はわかりませんか? とすれば、nullまたはその値が得られます。

+0

それはちょうどテストだった;)ありがとうたくさん – Vsplit

+0

あなたはそれが機能は非同期(テストなし)だと思いますか? – Vsplit

+0

答えを返しませんが、代わりに応答で呼び出されるコールバックを取る関数は(おそらく)非同期です。 ['async'](https://github.com/caolan/async)は、これらの種類のコントロールフローライブラリです。 –