node.js, express - синхронное выполнение запросов mysql один за другим внутри циклов

В моем экспресс-приложении node.js я выполняю вызов ajax сSuperAgent промежуточное программное обеспечение. Вызов выбирает данные базы данных в сложном массиве, используяУзел-MySQL промежуточное программное обеспечение через довольно много запросов к базе данных.

Прежде чем вставлять код, я пытаюсь объяснить словами, что я пытаюсь сделать, хотя кода будет достаточно, чтобы сказать, что он хочет сделать с дополнением, котороевсе асинхронные операции внутри первого обратного вызова должны выполняться синхронно.

Объяснение:

Внутри обратного вызова первого запроса выполняется цикл for для многократного выполнения второго запроса, и после каждого цикла следующий цикл вызывается только после завершения обратного вызова второго запроса. То же самое относится и к следующим строкам кода.

Код:

Вы можетеоднако пропустить внутренности (отмеченные в комментариях) для циклов for, чтобы сделать вещи краткими и простыми, если хотите.

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

Я пробовал сасинхронной промежуточное ПО, но напрасно, так как я просто не мог понять, какую функцию использовать в этом случае.

Короче говоря, требования:

1) Все асинхронные операции внутри первого обратного вызова должны выполняться синхронно.

2) ответ должен быть отправлен на вызов ajax только после того, как все вычисления выполнены, а не до этого (как это могло бы случиться, если бы все было асинхронно, как в существующем коде,не так ли?)

Ответы на вопрос(1)

Ваш ответ на вопрос