【发布时间】:2015-01-23 22:25:41
【问题描述】:
我在express 和ejs 的帮助下制作了一个小节点应用程序。
在我的一个控制器中,我返回一个对象,该对象具有我希望包含在视图中的承诺属性。我试图找出最好的方法是什么,因为ejs 似乎无法处理承诺的值。我考虑过在模型中包含承诺的值,但似乎我需要完成的代码过于复杂。
如何在ejs 中轻松呈现bluebird 承诺价值?
控制器
compaintsRouter.get('/', function(req, res)
{
var model = data.complaint.findAndCount({
include: [data.user, {
model: data.comment,
include: [data.user]
}],
limit: 15,
offset: 15 * (req.query.page || 0)
}).then(function(result){
res.render('complaints/list', {model: result.rows});
});
});
ejs查看模板
<% model.forEach(function(complaint) { %>
<div class="complaint">
... more html here...
<footer>
<span class="vote brand-success">
<% complaint.votesUp().then(function(votes){%>
<%= votes %>
<%}) %>
<span class="glyphicon glyphicon-thumbs-up clickable"></span>
</span>
</footer>
... more html here...
</div>
<% }) %>
承诺的方法:
votesUp: function() {
return this.getFollower().then(function(followers){
var aux = followers
.selectMany(function(f){return f.UserComplaint})
.map(function(v){
return ((v.liked === true) ? 1: 0);
});
aux.push(0);
aux.reduce(function(acc, v){
return acc+v;
});
})
}
【问题讨论】:
-
@Downvoter 是否愿意证明您的反对意见,以便我改进我的问题?
-
ejs 是否在其文档中的某处声明它支持承诺?如果模板确实支持承诺,那么您的
.then在模板中也是不必要的......支持承诺的模板只会呈现<% complaint.votesUp() %> -
@Esailija 我真的不知道这些信息如何改善我的问题,因为我已经在问题中声明 ejs 不支持承诺。我在视图中的代码是我展示我的问题以及我如何尝试解决它的温和诱惑,即使知道不支持承诺。在付出了一些努力之后,人们会愿意指导我吗?
-
因为如果不支持承诺,这是不可能的,所以请使用支持承诺的模板库......仅此而已。想想你将如何实现一个支持 Promise 的模板库,显然你需要检查模板是否创建了任何 Promise 并在渲染它之前等待它们。
标签: javascript node.js express ejs bluebird