node.js, express - synchrone Ausführung von MySQL-Abfragen nacheinander in Schleifen

In meiner node.js, Express-App, rufe ich mit dem @ ajax a superagent Middleware. Der Aufruf ruft Datenbankdaten in einem komplexen Array mit dem @ a node-mysql Middleware durch eine ganze Reihe von Datenbankabfragen.

Vor dem Einfügen des Codes versuche ich in Worten zu erklären, was ich versuche, obwohl der Code ausreichen würde, um zu sagen, was er mit dem Zusatz tun möchte, dass Alle asynchronen Vorgänge im ersten Rückruf sollten synchron ausgeführt werden.

Erläuterung

Neben dem Rückruf der ersten Abfrage wird eine for-Schleife ausgeführt, um die zweite Abfrage mehrmals auszuführen, und nach jeder Schleife soll die nächste Schleife erst aufgerufen werden, nachdem der Rückruf der zweiten Abfrage abgeschlossen ist. Dies gilt auch für die nächsten Codezeilen.

Code

Du kannstjedoch überspringen die Innereien (in Kommentaren markiert) der for-Schleifen, um die Dinge kurz und einfach zu machen, wenn Sie möchten.

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

Ich habe es mit dem @ versuc async Middleware, aber vergebens, da ich einfach nicht herausfinden konnte, welche Funktion in diesem Fall verwendet werden soll.

Um es kurz zu machen, die Anforderungen sind:

1) Alle asynchronen Vorgänge im ersten Rückruf sollten synchron ausgeführt werden.

2) Die Antwort sollte erst nach Abschluss aller Berechnungen an den Ajax-Aufruf gesendet werden und nicht vorher (da dies wahrscheinlich passieren würde, wenn die Dinge asynchron wären, wie sie sich im vorhandenen Code befinden). würde es nicht?)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage