【问题标题】:How to Include promise value in ejs?如何在 ejs 中包含承诺值?
【发布时间】:2015-01-23 22:25:41
【问题描述】:

我在expressejs 的帮助下制作了一个小节点应用程序。 在我的一个控制器中,我返回一个对象,该对象具有我希望包含在视图中的承诺属性。我试图找出最好的方法是什么,因为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 在模板中也是不必要的......支持承诺的模板只会呈现&lt;% complaint.votesUp() %&gt;
  • @Esailija 我真的不知道这些信息如何改善我的问题,因为我已经在问题中声明 ejs 不支持承诺。我在视图中的代码是我展示我的问题以及我如何尝试解决它的温和诱惑,即使知道不支持承诺。在付出了一些努力之后,人们会愿意指导我吗?
  • 因为如果不支持承诺,这是不可能的,所以请使用支持承诺的模板库......仅此而已。想想你将如何实现一个支持 Promise 的模板库,显然你需要检查模板是否创建了任何 Promise 并在渲染它之前等待它们。

标签: javascript node.js express ejs bluebird


【解决方案1】:

似乎答案可能是将业务逻辑混合到视图中。能不能早点拿到票,免得在模板里乱来?看起来很乱。 :)

(ps,+1 以抵消反对票)

【讨论】:

  • 我唯一能做的也许就是在我的查询中包含投票,然后从那里用数据计算投票。我想我只是想办法避免这种情况。
【解决方案2】:

似乎我缺少我的 orm 的一个功能,即 sequelize。只要我在查询中包含模型,它们就允许我检索关联。 需要做的修改如下:

控制器

compaintsRouter.get('/', function(req, res) 
{
    var model = data.complaint.findAndCount({
        include: [data.user, {
            model: data.comment,
            include: [data.user]
        }, {
            model: data.user,
            as: 'follower'
        }],
        limit: 15,
        offset: 15 * (req.query.page || 0) 
    }).then(function(result){
        res.render('complaints/list', {model: result.rows});
    });
});

使用数据的方法:

votesUp: function() {
        var aux = this.follower
            .selectMany(function(f){return f.UserComplaint})
            .map(function(v){ 
                return ((v.liked === true) ? 1: 0);
            });
        aux.push(0);
        return aux.reduce(function(acc, v){
            return acc+v;
        });
    }

【讨论】:

    猜你喜欢
    • 2015-03-25
    • 2018-10-03
    • 2020-07-04
    • 1970-01-01
    • 2021-03-13
    • 2020-01-29
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多