在NodeJS

时间:2015-11-14 07:30:34

标签: node.js express

我想从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});

但是,对于多个查询,此技术将涉及在每个函数调用时累积传递返回的“行”(此外,还有很多函数重定向)。

有没有更好的方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

由于NodeJS是异步的,所以在运行大型应用程序而不使用其他模块的情况下,你运气不佳。

处理异步调用的最流行的模块是asyncQ (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);
});

它非常简单,但您需要编辑您的函数以运行回调函数。