2016-12-21 13 views
-1

私はアプリケーションを開発するためにノードjsを使用しています。コントローラでは、私はforループを使用し、いくつかのコードを書いたが、forループで私はクエリを実行しています。したがって、そのクエリの前にループ実行のコードが一度完全に実行されます。例えば以下を参照してください。ループの実行中にノードJsに問題が発生しました

var commcount = []; 
     for (var j = 0, len = exlist.length; j < len; j++) { 
     console.log('exlist[j].id '+exlist[j].id); 
     ExModel.find({EXModel_ID:exlist[j].id, VALUE: {'$ne':''}},{_id:0}, {sort: {CREATION_DATE: -1}}, function(err1, examplist) { 
     if (err1) { 
      console.log('sub error '+err1); 
       commcount.push(0); 
     } else { 
      console.log('examplist.length '+examplist.length); 
       commcount.push(examplist.length); 
      } 
     }); 
     } 
     console.log('commcount length '+commcount.length); 

上記のコードでは、exlist.lengthが5であると仮定してください。forループは5回実行されます。出力コンソールでは、最初にexlist [j] .id値を5回表示してから、長さの値を0として表示し、次にexamplist.length値のみを表示します。したがって、クエリが実行される前に、他のステートメントやforループの後のステートメントのforループが実行されています。これを解決するために私を助けてください。 forループ内のクエリの結果リストの長さを配列に格納し、それらの配列値をforループの後に表示したい。

答えて

0

まずは、非同期関数を呼び出していることを知っておく必要があります。結果が何であっても、非同期関数は別のスレッドで実行されますが、出力を保証することはできません。あなたのコードは以下のコードに似ている、のは、出力がd c a bになります以下のコード

function run(){ 
console.log("d"); 
setTimeout(function(){ 
    console.log("a"); 
    setTimeout(function(){ 
    console.log("b"); 
    }); 
}); 
console.log("c"); 
} 

を実行してみましょう。

+0

出力は 'd c a b'となります –

+0

はい、あなたは正しいです!ごめんなさい!入力中に私は間違いを犯しました。 –

関連する問題