将多个查询渲染到同一个jade模板

时间:2015-08-06 18:36:17

标签: javascript node.js orientdb orientjs

客户要求提供将在同一网页中的2个表或列表中提供的动态信息。让我们举例来说,比较两个对象或文章。

JADE TEMPLATE

extends layout.jade

block content1
    div= foo_table
block content2
    div= bar_table

DATABASE QUERY

var table1 = db.query('select * from table where ...')
    .then(function (result){
        console.log(result);
    });

var table2 = db.query('select * from table where ...')
    .then(function (result){
        console.log(result);
    });

//I DON'T WANT TO SEND TO CONSOLE, JUST GET THE DATA, BUT IT IS ASYNCHRONOUS

使用返回而不是 console.log 不会返回数据集。

.then(function (result){
        return(result);
    });

No variable defined inside then() is persistent.

ROUTER CODE

如果我使用这种方法可行,但......:

router.get('/', function(req, res, next) {
    db.query('select * from table where ...')
    .then(function (result){
            res.send(result);
        });

问题是它只能提供1个查询。

我想同时服务2个街区:

router.get('/', function(req, res, next) {
    res.render('./index', { foo_table: table1, bar_table: table2});
};
  • 唯一的想法是 console.log 但是没有办法 将查询结果传递给模板( var tables 不要 存储查询结果。)

  • 我在"然后"内创建的任何变量或者异步功能不是 持久性。

  • JSON.stringify或parse不会转换这些嵌套函数的结果。

  • 在模板变量后调用函数或创建函数 定义(footable:*,bartable:*)不起作用。

  • 由于查询是可以的,我找不到任何转换方式 可存储的,或者相反,从各种可能的查询中收集结果 提供最终信息并呈现模板变量。

  • 我必须为每个表创建一个单独的AJAX方法 页面已加载?

  • 我想用开始的get方法提供整个页面。

1 个答案:

答案 0 :(得分:1)

如果您正在使用(或者您使用的库是基于的)Bluebird(或任何其他承诺库),那么您应该能够这样做:

Promise.all([
    db.query('select * from foo where ...'),
    db.query('select * from bar where ...')
])
.spread(function(foo, bar) {
    /* prepare data as you need them */
    res.render('./index', { foo_table: foo, bar_table: bar});
});

Promise.all异步"等待"直到传递的数组中的两个方法(db查询)都已完成并返回,然后将两个结果一起传递给传递给.spread()的回调(如this示例中所示)。