2017-01-08 4 views
0

私は "Promises"や "synchronize"や "sync"のようなモジュールのような解決策を見つけようとしていますが、適切な解決策はありません):nodejsの同期mysqlクエリは可能でしょうか?

私は10テーブル 'user'、 'data '、'ゲーム '。などの機能:

getUsers(){}  // UserTable 
getData(){}  // DataModel 
getGames(){}  // GameTable 
getUserByGames(){} // UserModel 

そして、いくつかのfuntionsは私のモデルやテーブルを返すために、ニーズを持っている...といくつかのケースでは、私はモデルやその「答えが」別のクエリと別のものを作ることが必要です。

だから、私は最善の方法、役に立たない「.then」またはそのようなものでそれを作るために、同期querysを実行する必要があります。あなたは私がnodejsにドイトことができる方法を知っていました/

(たぶんソリューションが真の各非同期機能で、偽にフラグを変更するコールバックのフラグを入れることができます。しばらくしてdosent最後のオリジナル機能?)

+0

あなたは本当に非同期モジュール上の滝の方法を見てみる必要があり、それはあなたの問題を解決します。あなたのような問題が発生したら、私は簡単に解決できました。確認:http://caolan.github.io/async/docs.html#waterfall –

+0

いいえ、あなたが知っている限り、同期クエリを行うことはできません。これは、すべてのクエリがノードプロセスをブロックするため、非常に悪いスタイルになります。ノードを使用する場合は、非同期操作を理解して使用することをお勧めします。 –

答えて

1

あなたはコールバックを混在させることができ、シーケンシャルおよび並列実行、ループ、再帰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 
関連する問題