将异步对象传递给dustjs模板

时间:2013-10-30 08:36:14

标签: node.js dust.js

我很难理解如何将从数据库中提取的对象传递给dust.js模板。

假设我有一个模板:

{#person}
{name} - {title}
{/person}

我尝试设置这样的上下文:

var ctx = {
     person: return chunk.map(function(chunk) {
         database.person(12345, function(data) {
            dust.nextTick(function() {
                    chunk.end(data); // What to really do here?
            });
         });
    });
}

其中database.person从数据库中获取对象并将其传递给回调。

然后我会运行渲染功能:

res.render('person', ctx);

2 个答案:

答案 0 :(得分:1)

正确的形式是:

var ctx = {
    person: function(chunk, context, bodies) {
        return chunk.map(function(chunk) {
            database.person(1234, function(data) {
                return chunk.render(bodies.block, context.push(data)).end();
            });
        });
    }
}

而不是写,我必须像Alan的回答一样调用render。

整个db调用必须包含在返回的chunk.map调用中。我还必须链接一个结束命令,将结果发送回流。

为什么需要这些电话需要在dust.js指南(http://akdubya.github.io/dustjs/#guide)中说明:

  

chunk.map告诉Dust制作一个新的块,保留一个插槽   在继续渲染其余部分之前的输出流   模板。你必须(最终)在映射的块上调用chunk.end()   将其内容编织回流中。

这是LinkedIn指南页面中没有解决的问题。

答案 1 :(得分:0)

我假设您的db调用将返回json对象的行,例如下面的“数据”。

异步代码看起来不错。 chunk.write只会写出你提供的任何内容,因此你需要在上下文中传递数据,以便可以在模板中访问它。使用chunk.render而不是write。一个非异步的例子是:

{
    "person": function(chunk, context, bodies) {
        var data = {name:"Smith", title:"Mr"};
        return chunk.render(bodies.block, context.push(data));
    }
}

通过linkedin dust tests运行它似乎得到了正确的答案。

希望有所帮助, 艾伦