将多个查询呈现到同一个 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});
};
我唯一想到的是 console.log 但是没有办法
将查询结果传递给模板(var tables 不
存储查询结果)。
我在 "then" 或异步函数中创建的任何变量都不是
执着。
JSON.stringify or parse 不转换这些嵌套函数的结果。
在模板变量后回调函数或创建函数
定义 (footable: *, bartable: *) 不起作用。
因为查询是可行的,所以我找不到任何方法可以转换成
可存储的,或者相反,从各种可查询的结果中收集结果
提供最终信息并呈现模板变量。
我必须为每个 table 创建单独的 AJAX 方法吗?
页面已加载?
我想从一开始就使用 get 方法为整个页面提供服务。
如果您正在使用(或您使用的库基于)类似 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 示例中一样)。
客户要求提供动态信息,这些信息将提供给同一网页中的 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});
};
我唯一想到的是 console.log 但是没有办法 将查询结果传递给模板(var tables 不 存储查询结果)。
我在 "then" 或异步函数中创建的任何变量都不是 执着。
JSON.stringify or parse 不转换这些嵌套函数的结果。
在模板变量后回调函数或创建函数 定义 (footable: *, bartable: *) 不起作用。
因为查询是可行的,所以我找不到任何方法可以转换成 可存储的,或者相反,从各种可查询的结果中收集结果 提供最终信息并呈现模板变量。
我必须为每个 table 创建单独的 AJAX 方法吗? 页面已加载?
我想从一开始就使用 get 方法为整个页面提供服务。
如果您正在使用(或您使用的库基于)类似 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 示例中一样)。