与Dust.jsasynchronous自我closures助手

我最近一直在尝试Dust.js,因为它支持asynchronous佣工,但是我发现这似乎不是这样的情况。

例如,给出以下灰尘模板:

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

如果formatResultDate帮助器是同步的,那么这是没有问题的,我可以写出date:

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

但是,如果模板是asynchronous的 – 使用承诺 – 则不会输出:

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

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

我知道,asynchronous自闭标签可能是不可能的; 深入研究源代码我发现了这个评论,但是我不太明白这是什么意思,我还没有在文档或search中find任何进一步的解释。

只要使用{formatResultDate}来执行帮助器作为参考 – 一个自我closures的帮助器没有正文呈现。

另外,一个助手应该返回一个值或返回修改过的块 – 它不应该写入一个块,然后返回一些非块值。

只要答复自己,尘埃会做剩下的事情。


根据您的评论更新:

尘埃中有两种助手。 如果你的帮助函数是你的上下文的一部分,那么它就是一个“上下文帮助器”。 如果你把它附加到dust.helpers对象上,它就是一个“全局帮手”。

你链接的评论(我写的)表示全球帮手可以自我closures。 {@formatResultDate/}会将其返回值输出到模板中。 但是,上下文助手可以作为引用或块部分来访问(尽pipe正如你所提到的,你不能将parameter passing给引用)。 由于Dust不会尝试渲染没有body的节,所以context helper遵循这些语义。

既然你需要传递参数,你有几个选项。

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

2)你可以使用chunk.map来处理chunk.map老派的方式,就像每个人在Dust 2.7之前chunk.map 。 这个函数告诉Dust你的块是asynchronous的。 为此,请查看名为“Asynchronous context Helpers ”的Context Helpers指南。 你会写这样的东西:

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