2016-10-26 2 views
1

私はデータベースから2つの配列を持って、これはサンプルです。
私はforeachで何かをしようとしますが、答えは私が期待していません。ノードJS 2つのforeach予期しない

なぜconso.log印刷シーケンスではなく、ループアウト

0ループ内
ループ0
ループにおける1
ループにおける2
ループ3
出ていますループ1
ループ0
ループ1
ループ2ループ3内の
ループ4
。 。 。

[マイコード]

modules.dbCmder.query(DefaultDB, DefaultDB, strSQL, [], function (data) { 
     data.forEach(function (value, index, array) { 
      console.log('out loop ' + index); 
      modules.dbCmder.query(DefaultDB, DefaultDB, strSQL2, [], function (res) { 
       data.forEach(function (value, index, array) { 
        console.log('in loop ' + index); 
       }); 
      }); 
     }); 
    }); 

[コードの結果]

out loop 0 
out loop 1 
out loop 2 
out loop 3 
out loop 4 
in loop 0 
in loop 1 
in loop 2 
in loop 3 
in loop 4 
in loop 0 
in loop 1 
in loop 2 
in loop 3 
in loop 4 
in loop 0 
in loop 1 
in loop 2 
in loop 3 
in loop 4 

答えて

0

基本的には、Javascriptがイベント・スタック上modules.dbCmder.query関数呼び出しを入れ、その後、現在のforEach()に上に移動しています。したがって、queryへの4回の呼び出しが積み上げられている間に、外側のforEach()が完了するまで実行され、順番に解決されます。それが「なぜ」これが起こっているかに対する答えです。

asyncのようなコントロールフローライブラリを実行すると、queryが確実に解決され、次に外側のforEachの前に解決されます。

async.eachSeries(data, function(item, eachCb){ 
    console.log('out loop on item ' + item); 
    modules.dbCmder.query(DefaultDB, DefaultDB, strSQL2, [], function (res) { 
    data.forEach(function (value, index, array) { 
     console.log('in loop ' + index); 
    }); 
    eachCb(); 
    }); 
}, function(err){ 
console.log("Processing done."); 
}); 
+0

よう

何かがあなたの助けをいただき、ありがとうございます。できます。 –

関連する問題