Dust.js 的异步自关闭助手

Async self-closing helpers with Dust.js

我最近一直在尝试 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)
}

但是,如果模板是异步的 - 使用承诺 - 则不会输出任何内容:

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

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

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

只需使用 {formatResultDate} 执行助手作为参考 -- self-closing 助手没有要渲染的主体。

此外,助手应该 return 一个值或 return 修改后的块——它不应该同时写入一个块然后 return 一些 non-chunk值。

只是 return 承诺本身,Dust 会完成剩下的工作。


根据您的评论更新:

Dust 中有两种助手。如果您将辅助函数作为上下文的一部分包含在内,那么它就是 "context helper"。如果将它附加到 dust.helpers 对象,它就是 "global helper".

您链接的评论(我写的)表明 global 助手可以 self-close。 {@formatResultDate/} 会将其 return 值输出到模板中。然而,上下文助手可以作为引用或块部分访问(尽管如您所述,您不能将参数传递给引用)。因为 Dust 不会尝试渲染没有主体的部分,所以上下文助手遵循这些语义。

由于您需要传递参数,因此您有几个选择。

1) 您可以将您的助手附加到 dust.helpers 对象并像 {@formatResultDate date=myDate /} 一样访问它。助手可以 return 一个 Promise 并且 Promise 的值将输出到模板中。更多信息:Dust Helpers(请参阅“添加新助手”部分)

2) 您可以使用 old-school 方式处理 Promises,就像在 Dust 2.7 之前的每个人一样,使用 chunk.map。这个函数向 Dust 发出你的块是异步的信号。为此,请查看 Context Helpers 指南中名为 "Asynchronous context helpers" 的部分。你会这样写:

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