Javascript 带Dust.js的异步自动关闭辅助程序

Javascript 带Dust.js的异步自动关闭辅助程序,javascript,node.js,dust.js,Javascript,Node.js,Dust.js,我最近一直在尝试Dust.js,因为它支持异步助手,但我发现一个情况似乎并非如此 例如,给定以下灰尘模板: <ul> {#getResults} <li>{#isResultNew"}*New*{/isResultNew} {message}, {#formatResultDate format="d/m/y" /}</li> {/getResults} </ul> 但是,如果模板是异步的(使用承诺),则不会输出任何内容: fun

我最近一直在尝试Dust.js,因为它支持异步助手,但我发现一个情况似乎并非如此

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

<ul>
  {#getResults}
    <li>{#isResultNew"}*New*{/isResultNew} {message}, {#formatResultDate format="d/m/y" /}</li>
  {/getResults}
</ul>
但是,如果模板是异步的(使用承诺),则不会输出任何内容:

function formatResultDate(chunk, context, bodies, params) {
  ...
  return Promise.resolve(date).then(value => chunk.write(value))
}
我可以通过提供一个标记体(
{formatResultDate format=“d/m/y”}{.}{/formatResultDate}
)来解决这个限制,但这并不是我所期望的行为


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

只需使用
{formatResultDate}
执行帮助程序作为引用—自动关闭的帮助程序没有主体可渲染

此外,助手应该返回一个值或返回修改过的块——它不应该既写入块,又返回一些非块值

只要兑现诺言,剩下的就交给尘土了


根据您的评论更新:

灰尘中有两种类型的助手。如果将助手函数作为上下文的一部分,那么它就是“上下文助手”。如果将其附加到
dust.helpers
对象,则它是一个“全局辅助对象”

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

由于需要传递参数,因此有两个选项

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

2) 通过使用
chunk.map
,您可以像Dust 2.7之前的每个人一样,以传统的方式处理承诺。此函数向Dust发出信号,表明块是异步的。要做到这一点,请参阅指南中名为“异步上下文帮助器”的部分。你可以这样写:

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

谢谢你的回复。恐怕我的示例过于简单,所讨论的助手需要参数。你的答案肯定还是有用的,不过=]我已经在我的答案中添加了更多信息以适合你的用例。再次感谢你的详细回复。我假设上下文帮助器与全局帮助器具有相同的语义。在这种情况下,我希望他们是这样的,因此我根据您的示例实现了一个解决方案。谢谢。从我在dust代码中读到的内容来看,你能简单地尝试“return-Promise.resolve(date)”而不是“return-Promise.resolve(date).然后(value=>chunk.write(value))”吗<代码>参考似乎正在重新进入并达到承诺的结果。(我不是粉尘使用者)
"formatResultDate": function(chunk, context, bodies, params) {
  return chunk.map((chunk) => Promise.resolve(date).then(chunk.end));
}