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?)

questionAnswers(1)

yourAnswerToTheQuestion