javascript - 使用 Dust.js 的异步自关闭助手

标签 javascript node.js 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)
}

但是,如果模板是异步的 - 使用 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/

相关文章:

javascript - 如何阻止 DustJS 将实体转换回普通字符?

javascript - dust.js eq 帮助程序无法正常工作

javascript - 在 rails 中动态生成 Bootstrap 选项卡

javascript - Firefox 会默默地忽略一些不违法的 CSS 值

javascript - 去除 Highcharts 曲线上的抗锯齿

javascript - 自动启动和停止 node.js 脚本

javascript - 替换字符串中的前 N ​​次出现

javascript - 一键删除多个选定的 DataTable 行?

javascript - 如何在使用 node.js 时从 URL 中获取 Id

jquery - 模糊整个 <li> 除了最后一个词