使用Dust.js的异步自动关闭助手

时间:2016-01-03 19:20:09

标签: javascript node.js dust.js

我最近一直在尝试使用Dust.js,因为它支持异步帮助,但我发现这种情况似乎不是这样。

例如,给定以下Dust模板:

<ul>
  {#getResults}
    <li>{#isResultNew"}*New*{/isResultNew} {message}, {#formatResultDate format="d/m/y" /}</li>
  {/getResults}
</ul>

如果formatResultDate助手是同步的,那么没问题,我可以写出日期:

function formatResultDate(chunk, context, bodies, params) {
  ...
  return chunk.write(value)
}

但是,如果模板是异步的 - 使用promise - 则不会输出任何内容:

function formatResultDate(chunk, context, bodies, params) {
  ...
  return Promise.resolve(date).then(value => chunk.write(value))
}

我可以通过提供标记正文({#formatResultDate format="d/m/y"}{.}{/formatResultDate})来解决此限制,但这并不是我期望的行为。

我知道异步自动关闭标签可能无法实现;深入研究我发现this comment的源代码,但我并不理解它的含义,我还没有在文档或搜索中找到任何进一步的解释。

1 个答案:

答案 0 :(得分:0)

只需使用{formatResultDate}执行辅助工具作为参考 - 自我关闭帮助器没有可渲染的主体。

此外,帮助程序应该返回一个值或返回修改后的块 - 它不应该写入块然后返回一些非块值。

只需返回承诺本身,Dust将完成其余的工作。

根据您的评论进行更新:

Dust中有两种类型的助手。如果将辅助函数作为上下文的一部分包含在内,则它是一个“上下文帮助器”。如果将它附加到dust.helpers对象,则它是“全局帮助者”。

您关联的评论(我写的)表明全球帮助可以自我关闭。 {@formatResultDate/}会将其返回值输出到模板中。但是,上下文帮助程序可以作为引用或块部分进行访问(尽管如您所述,您不能将参数传递给引用)。因为Dust不会尝试渲染没有body的部分,所以上下文助手会遵循这些语义。

由于您需要传递参数,因此您有几个选项。

1)您可以将助手附加到dust.helpers对象,并像{@formatResultDate date=myDate /}一样访问它。帮助器可以返回Promise,Promise的值将输出到模板中。更多信息:Dust Helpers(参见添加新助手部分)

2)你可以使用chunk.map处理Promises的老派方式,就像每个人在Dust 2.7之前做的那样。此函数向Dust发出信号,表示您的块是异步的。为此,请查看名为“异步上下文帮助程序”的Context Helpers指南的部分。你会写这样的东西:

"formatResultDate": function(chunk, context, bodies, params) {
  return chunk.map((chunk) => Promise.resolve(date).then(chunk.end));
}