【发布时间】:2015-02-23 02:39:46
【问题描述】:
在我的 node.js,express 应用程序中,我正在使用 superagent 中间件进行 ajax 调用。该调用使用node-mysql 中间件通过相当多的数据库查询来获取复杂数组中的数据库数据。
在粘贴代码之前,我试图用文字解释我正在尝试做的事情,尽管代码足以说明它想要做什么,以及第一个里面的所有异步内容回调应该以同步的方式完成。
说明:
在第一个查询的回调中,执行了一个 for 循环多次运行第二个查询,并且在每个循环之后,只有在第二个查询的回调完成后才调用下一个循环。接下来的代码行也是一样的。
代码:
您可以但是跳过 for 循环的内部结构(以 cmets 标记),以使事情变得简单明了。
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)
});
我尝试使用 async 中间件但徒劳无功,因为我无法确定在这种情况下使用哪个函数。
简而言之,要求是:
1)第一个回调里面的所有异步的事情都应该用同步的方式来完成。
2)只有在所有计算完成之后才应该将响应发送到 ajax 调用,而不是在此之前(因为如果事情是异步的,因为它们在现有代码中可能会发生,不是吗?)
【问题讨论】:
-
我认为您应该使用async - 这将解决您的问题。
-
@hgoebl,我在我的问题中说我无法弄清楚我应该使用哪个异步函数。
-
你应该查看
async的waterfall方法 -
看看 async.each 这正是你需要使用的
-
@VsevolodGoloviznin,我必须在 for 循环中运行数据库查询,
waterfall方法如何提供帮助?
标签: node.js asynchronous express node-mysql