2017-01-20 22 views
0

をNode.jsの私はNode.jsの更新変数の値と

で非同期コールバックを理解することの問題は、これが私のコードでしまった:

//userRole is a session value 

//capabilities is an array of strings 

var check = 0; 

capabilities.forEach((index)=> { 

connection.query("SELECT * FROM doc_users_role WHERE name = ? 

AND " + index  + "= 1 ",[userRole], function(err, rows){ 

if(rows.length == 1){ 

check++;} 

}); 
}) 
console.log(check) //returns always 0; 

どのように私はこの問題を解決することができます非同期の方法?私はforeach内に住んでいるコールバック(connection.query 1)内から変数チェックを更新する必要があります...ありがとう!以下に示すように

+0

これは非同期で実行されているようです。最後のパラメータとして渡した関数がコールバックです。 – gregnr

答えて

1

これは非同期モジュールを使用して達成することができます。 nodejsノンブロッキングな性質のため、別の方法で言わない限り、ループが終了するのを待つことなく実行を続けます。ここでコールバックが入ります.forEachSeriesループの各反復が実行され、コールバックが実行されてループに次の反復の準備ができていることが伝えられます。このようにして、各反復が順番に実行されます。コンソールログは最後のブロックに配置されます。これは、forEachSeriesの完了時に実行されるコードであり、変数の正しい値が確実に表示されます。これがあなたの質問に答えることを願っています

 async.forEachSeries(capabilities, function (index, forEachCallback){ 

      connection.query("SELECT * FROM doc_users_role WHERE name = ? 

      AND " + index  + "= 1 ",[userRole], function(err, rows){ 

       if(rows.length == 1){ 
        check++; 
        forEachCallback(); 
       } 
       else{ 
        forEachCallback(); 
       } 

      }); 

     }, function(err) { 
      if (err){ 
       // catch error and do something 
       return; 
      } 
      console.log(check); 
     }); 
+0

これは素晴らしかったです。今私は最後の問題があります。 "能力"は、私がいくつかの特定のルートに着くときに呼び出すクラス "ロール"のメソッドです。 実際には、すべてのcapabilityメソッドをtrueとして返す必要があるので、ルートノードの取得リクエストを作成するときは、まず「roles.capabilities」がtrueであるかどうかをチェックし、それが真の場合は、あなたは私を助けてくれますか? var "check"がcapabilities.lengthと等しいときに関数 "true"を返すことはできません...ありがとうございました –

+0

問題が正しく理解できれば、console.logを置き換える必要があります); checkがroles.capabilites.lengthと等しいかどうかをチェックするif文と、roles.capabilitiesをtrueに設定した場合、単にroles.capabilities = trueのように、上の答えがあなたの最初の問題を解決した場合、あなたには正しいとマークしてください。 –

関連する問題