node.js, express: ejecución de consultas mysql una tras otra dentro de bucles de forma síncrona

En mi nodo.js, aplicación express, estoy haciendo una llamada ajax con elsuperagente middleware La llamada obtiene datos de la base de datos en una matriz compleja utilizando elnode-mysql middleware a través de bastantes consultas de bases de datos.

Antes de pegar el código, estoy tratando de explicar en palabras lo que estoy tratando de hacer, aunque el código sería suficiente para decir lo que quiere hacer con la adición de queTodas las cosas asincrónicas dentro de la primera devolución de llamada deben hacerse de forma sincrónica.

Explicación:

Dentro de la devolución de llamada de la primera consulta, se ejecuta un bucle for para ejecutar la segunda consulta varias veces y después de cada bucle, se debe llamar al siguiente bucle solo después de que se complete la devolución de llamada de la segunda consulta. Las cosas también son iguales para las siguientes líneas de código.

Código:

Usted puedesin embargo saltar las entrañas (marcadas en los comentarios) de los bucles for para hacer las cosas breves y fáciles si lo desea.

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)    
});

Lo intenté con elasíncrono middleware pero en vano, ya que no pude averiguar qué función usar en este caso.

Para ser breves, los requisitos son:

1) Todas las cosas asincrónicas dentro de la primera devolución de llamada deben hacerse de forma sincrónica.

2) la respuesta debe enviarse a la llamada ajax solo después de que se hayan realizado todos los cálculos y no antes (como probablemente sucedería si las cosas fueran asíncronas como están en el código existente,¿no es así?)

Respuestas a la pregunta(1)

Su respuesta a la pregunta