2016-01-03 4 views
2

Я недавно пробовал 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, но я не совсем понимаю, что это значит, и я еще не нашел никаких дальнейших объяснений в документации или поиске.

+0

Из того, что я прочитал в коде пыли, попробуйте просто «вернуть обещание.Разрешить (date) "вместо" return Promise.resolve (date) .then (value => chunk.write (value)) ".' reference', кажется, повторно входит и достигает https://github.com/linkedin /dustjs/blob/3fc12efd153433a21fd79ac81e8c5f5d6f273a1c/dist/dust-core.js#L762 с результатом обещания (я не являюсь пользователем пыли) –

ответ

0

Просто используйте {formatResultDate} для выполнения помощника в качестве эталона - самозакрывающийся помощник не имеет тела для визуализации.

Кроме того, хелпер должен либо возвращать значение, либо возвращать модифицированный кусок - он не должен записываться в кусок, а затем возвращать некоторое нечетное значение.

Просто верните обещание, и Пыль сделает все остальное.


Обновления на основе вашего комментария:

Есть два типа помощников в пыли. Если вы включаете свою вспомогательную функцию как часть своего контекста, она является «помощником контекста». Если вы присоедините его к объекту dust.helpers, он станет «глобальным помощником».

Комментарий, который вы указали (который я написал), указывает, что глобальный помощник может самостоятельно закрыться. {@formatResultDate/} выведет свое возвращаемое значение в шаблон. Контекстные помощники, однако, могут быть доступны либо в виде ссылок, либо как разделы блоков (хотя, как вы упомянули, вы не можете передавать параметры в ссылку). Поскольку Dust не пытается отображать разделы без тела, контекстные помощники следуют этой семантике.

Поскольку вам необходимо передать параметры, у вас есть пара вариантов.

1) Вы можете прикрепить своего помощника к объекту dust.helpers и получить к нему доступ, как {@formatResultDate date=myDate /}. Помощник может вернуть Promise, и значение этого обещания будет выведено в шаблон. Дополнительная информация: Dust Helpers (см. Раздел «Добавление новых помощников»)

2) Вы можете справиться с обещаниями по старой школе, как и все до Пыли 2.7, используя chunk.map. Эта функция сигнализирует Пыли, что ваш блок асинхронен. Для этого просмотрите раздел руководства Context Helpers под названием «Асинхронные контекстные помощники». Вы бы написали что-то вроде этого:

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

Спасибо за ваш ответ. Боюсь, мой пример был упрощен, помощник в вопрос требует параметров. Ваш ответ определенно еще полезен, чтобы знать, хотя =] –

+0

Я добавил больше информации к моему ответу, чтобы соответствовать вашему варианту использования. – Interrobang

+0

Еще раз спасибо за подробный ответ. Я сделал предположение, что контекстные помощники имели та же семантика, что и глобальные помощники. В этой ситуации я бы предпочел, чтобы они были такими, поэтому я применил решение на основе вашего примера. –