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 только после того, как все вычисления выполнены, а не до этого (как это могло бы случиться, если бы все было асинхронно, как в существующем коде,не так ли?)