/ /予期せぬノード2つのforeach - node.js

ノードJS 2つのforeachの予期しない - node.js

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

なぜconso.logの印刷順序が違うのですか?

ループ0
ループ0内
ループ1で
ループ2で
ループ3で
ループ4で
アウトループ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

回答:

回答№1は0

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

解決策は、以下のようなコントロールフローライブラリを実行することです。 非同期 確実に 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.");
});