あなたはコールバックを混在させることができ、シーケンシャルおよび並列実行、ループ、再帰SynJS。ここで説明する例である:
var SynJS = require('synjs');
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'tracker',
password : 'tracker123',
database : 'tracker'
});
function runSQLQuery(modules,connection,context,query,queryParams) {
var res = {done: false};
connection.query(query,queryParams, function(err, rows, fields) {
res.err = err;
res.rows = rows;
res.done = true;
//console.log('got rows:',rows);
modules.SynJS.resume(context);
});
return res;
}
function myFunc(modules,connection) {
for(var i=0; i<3; i++) {
console.log('Iteration:',i);
// sequential execution
var res1 = modules.runSQLQuery(modules,connection,_synjsContext,"SELECT 100+? as id",[i]);
SynJS.wait(res1.done);
console.log("res1=", res1.rows);
var res2 = modules.runSQLQuery(modules,connection,_synjsContext,"SELECT 200+? as id",[i]);
SynJS.wait(res2.done);
console.log("res2=", res2.rows);
// parallel execution
var res3 = modules.runSQLQuery(modules,connection,_synjsContext,"SELECT 300+? as id",[i]);
var res4 = modules.runSQLQuery(modules,connection,_synjsContext,"SELECT 400+? as id",[i]);
SynJS.wait(res3.done && res4.done);
console.log("res3,4=", res3.rows, res4.rows);
}
};
var modules = {
SynJS: SynJS,
mysql: mysql,
runSQLQuery: runSQLQuery,
};
SynJS.run(myFunc,null,modules,connection,function() {
console.log('done');
connection.end();
});
それが出力を次生成:
Iteration: 0
res1= [ { id: 100 } ]
res2= [ { id: 200 } ]
res3,4= [ { id: 300 } ] [ { id: 400 } ]
Iteration: 1
res1= [ { id: 101 } ]
res2= [ { id: 201 } ]
res3,4= [ { id: 301 } ] [ { id: 401 } ]
Iteration: 2
res1= [ { id: 102 } ]
res2= [ { id: 202 } ]
res3,4= [ { id: 302 } ] [ { id: 402 } ]
done
あなたは本当に非同期モジュール上の滝の方法を見てみる必要があり、それはあなたの問題を解決します。あなたのような問題が発生したら、私は簡単に解決できました。確認:http://caolan.github.io/async/docs.html#waterfall –
いいえ、あなたが知っている限り、同期クエリを行うことはできません。これは、すべてのクエリがノードプロセスをブロックするため、非常に悪いスタイルになります。ノードを使用する場合は、非同期操作を理解して使用することをお勧めします。 –