私はデータベースから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.");
});