node.js, express - executando consultas mysql uma após a outra dentro de loops de maneira síncrona
No meu node.js, aplicativo expresso, estou fazendo uma chamada ajax com osuperagente middleware. A chamada busca dados do banco de dados em uma matriz complexa usando o métodonode-mysql middleware através de algumas consultas ao banco de dados.
Antes de colar o código, estou tentando explicar em palavras o que estou tentando fazer, embora o código seja suficiente para dizer o que ele quer fazer com a adição de quetodas as coisas assíncronas dentro do primeiro retorno de chamada devem ser feitas da maneira síncrona.
Explicação:
Dentro do retorno de chamada da primeira consulta, um loop for é executado para executar a segunda consulta várias vezes e após cada loop, o próximo loop deve ser chamado somente após a conclusão do retorno de chamada da segunda consulta. As coisas também são iguais para as próximas linhas de código.
Código:
Você podeno entanto pule as entranhas (marcadas nos comentários) dos loops for para tornar as coisas breves e fáceis, se você desejar.
conn.query("SELECT * FROM `super_cats`",function(error, results, fields) {
if(error){console.log("erro while fetching products for homepage "+ error);}
for(var i in results) { // FIRST FOR LOOP INSIDE THE FIRST QUERY CALLBACK
/*Innards of for loop starts*/
var elem = new Object();
var supcat_id=results[i].id;
elem.super_id =supcat_id;
elem.cats=new Array();
var cat= '';
/*Innards of for loop ends*/
conn.query("SELECT * FROM `categories` WHERE `supcat_id`="+supcat_id,function(error_cats, results_cats, fields_cats) {
if (error_cats) {console.log("erro while fetching cats for menu " + error_cats);}
for(var j in results_cats) {
/*Innards of for loop starts*/
cat= new Object();
var cat_id=results_cats[j].id;
cat.cat_id=cat_id;
cat.cat_name=results_cats[j].cat_name;
cat.subcats=new Array();
/*Innards of for loop starts*/
conn.query("SELECT * FROM `subcategories` WHERE `category`="+cat_id,function(error_subcats, results_subcats, fields_subcats) {
if (error_subcats) {console.log("erro while fetching subcats for menu " + error_subcats);}
for(var k in results_subcats ){
/*Innards of for loop starts*/
var subcat=new Object();
var subcat_id=results_subcats[k].id;
subcat.subcat_id=subcat_id;
subcat.subcat_name=results_subcats[k].subcategory;
cat.subcats.push(subcat);
elem.cats.push(cat);
/*Innards of for loop starts*/
}// end of for loop for results_subcats
});
}// end of for loop for result_cats
});
super_cats.push(elem);
}// end of for supercat results
res.send(super_cats)
});
Eu tentei com oassíncrono middleware, mas em vão, como eu simplesmente não conseguia descobrir qual função usar neste caso.
Para ser breve, os requisitos são:
1) Todas as coisas assíncronas dentro do primeiro retorno de chamada devem ser feitas da maneira síncrona.
2) a resposta deve ser enviada para a chamada ajax somente depois que todos os cálculos estiverem concluídos e não antes disso (como provavelmente aconteceria se as coisas fossem assíncronas como estão no código existente,não seria?)