与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)); }