客户要求提供将在同一网页中的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方法提供整个页面。
答案 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示例中所示)。