2017-01-08 3 views
0

Я пытаюсь найти такие решения, как «Promices» или такие модули, как «синхронизация» или «синхронизация», но я не очень хорошо разбираюсь в решении):Возможно синхронный запрос mysql в nodejs?

То, как у меня есть 10 «пользовательских» данных, ',' game '. А такие функции, как:

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

И некоторые Funtions есть потребности, чтобы вернуть мне модель или стол ... и в некоторых случаях мне нужна эта модель или что «ответ», чтобы сделать еще один запрос, и другой материал.

Таким образом, мне нужно делать синхронные querys, чтобы сделать что наилучшим способом, без использования «.Затем» или вещи, как это:/

Вы знаете, как я могу Doit в nodejs?

(Может быть, решение может быть поставлен флаг в истинной каждой функции асинхронной и в обратном вызове изменить флаг ложны. С некоторое время для доцент конца исходной функции?)

+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 
Смежные вопросы