将多个查询呈现到同一个 jade 模板

Render multiple queries to the same jade template

客户要求提供动态信息,这些信息将提供给同一网页中的 2 个 table 或列表。比方说,比较 2 个对象或文章。

翡翠模板

extends layout.jade

block content1
    div= foo_table
block content2
    div= bar_table

数据库查询

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

使用return代替console.log不会return数据集。

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

No variable defined inside then() is persistent.

路由器代码

如果我使用此方法,它会起作用,但是...:[=​​15=]

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});
};

如果您正在使用(或您使用的库基于)类似 Bluebird(或任何其他 promise 库)的东西,那么您应该可以这样做:

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 异步 "waits" 直到传递数组中的两个方法(数据库查询)完成并返回,然后将两个结果一起传递给传递给 .spread() 的回调(就像在 this 示例中一样)。