我最近一直在尝试 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但我不太明白这意味着什么,而且我还没有在文档或搜索中找到任何进一步的解释。
最佳答案
只需使用 {formatResultDate}
来执行帮助程序作为引用 - 自关闭帮助程序没有要渲染的正文。
此外,助手应该返回一个值或返回修改后的 block ——它不应该既写入 block 又返回一些非 block 值。
只需返回 Promise 本身,Dust 就会完成剩下的工作。
<小时/>根据您的评论更新:
Dust中有两种类型的助手。如果您将辅助函数包含在上下文中,那么它就是“上下文辅助函数”。如果将其附加到 dust.helpers
对象,它就是一个“全局助手”。
您链接的评论(我写的)表明全局帮助程序可以自动关闭。 {@formatResultDate/}
会将其返回值输出到模板中。但是,上下文助手可以作为引用或 block 部分进行访问(尽管正如您所提到的,您不能将参数传递给引用)。因为 Dust 不会尝试渲染没有主体的部分,所以上下文助手遵循这些语义。
由于您需要传递参数,因此您有几个选择。
1) 您可以将助手附加到 dust.helpers
对象并像 {@formatResultDate date=myDate/}
一样访问它。 helper 可以返回一个 Promise,并且该 Promise 的值将被输出到模板中。更多信息:Dust Helpers (请参阅添加新助手部分)
2) 您可以使用 chunk.map
以老式方式处理 Promise,就像每个人在 Dust 2.7 之前所做的那样。该函数向 Dust 发出信号,表明您的 block 是异步的。为此,请查看 Context Helpers 的部分名为“异步上下文助手”的指南。你可以写这样的东西:
"formatResultDate": function(chunk, context, bodies, params) {
return chunk.map((chunk) => Promise.resolve(date).then(chunk.end));
}
关于javascript - 使用 Dust.js 的异步自关闭助手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34580596/