我最近一直在尝试使用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的源代码,但我并不理解它的含义,我还没有在文档或搜索中找到任何进一步的解释。
答案 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));
}