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