我想从NodeJS向我的模板渲染多个查询的结果。
connection.query("select * from table1",function(err,rows){
if(!err) {
var data1 = JSON.parse(JSON.stringify(rows));
var data2 = fetchDataFromOtherTable(connection); //returns rows from another table
console.log(data2); //prints undefined
res.render('template-page',{data1:data1,data2:data2});
}
});
由于javascript的异步特性,这种行为很明显,如果我将data1传递给'fetchDataFromOtherTable'然后从该函数渲染,则可以解决这个问题:
fetchDataFromOtherTable(res,data1,connection);
/*In fetchDataFromOtherTable */
data2 = JSON.parse(JSON.stringify(rows));
res.render('template-page',{data1:data1,data2:data2});
但是,对于多个查询,此技术将涉及在每个函数调用时累积传递返回的“行”(此外,还有很多函数重定向)。
有没有更好的方法来实现这一目标?
答案 0 :(得分:1)
由于NodeJS是异步的,所以在运行大型应用程序而不使用其他模块的情况下,你运气不佳。
处理异步调用的最流行的模块是async和Q (promises)。
以下是如何使用 async 处理异步操作的示例:
async.auto({
get_data: function(callback){
console.log('in get_data');
// async code to get some data
callback(null, 'data', 'converted to array');
},
make_folder: function(callback){
console.log('in make_folder');
// async code to create a directory to store a file in
// this is run at the same time as getting the data
callback(null, 'folder');
}]
}, function(err, results) {
console.log('err = ', err);
console.log('results = ', results);
});
它非常简单,但您需要编辑您的函数以运行回调函数。