Я пытаюсь отлаживать что-то, и я хотел бы видеть, что находится на канале, прежде чем потреблять его.Есть ли способ заглянуть в асинхронные каналы Clojure, не потребляя их значений?
ответ
только для отладки, вы можете использовать что-то похожее на функцию ниже, чтобы наблюдать значение на канале фактически не take!
ИНГ его (Предупреждение: это во многом зависит от core.async
implementationdetails):
(defn peek [ch]
(if (and (.buf ch)
(pos? (count (.buf ch))))
(if (instance? clojure.core.async.impl.buffers.PromiseBuffer
(.buf ch))
(a/<!! ch)
(last (.buf (.buf ch))))
(some-> ch .puts first second)))
core.async
сам по себе не предоставляет общедоступный API для peek
исходящего значения из канала.
Как отмечено @amalloy, функция выше может не работать для других видов буферов, в частности для тех, у которых нет buf
объявленного поля.
спасибо ... Я дам ему попробовать – interstar
Даже если вы проверяете 'PromiseBuffer', я думаю, вы должны дать более сильное предупреждение, чем« это зависит от деталей реализации ». Используемые протоколы core.async открыты, поэтому каждый мог создать новый вид канала с разными внутренними элементами, который не будет иметь поле 'buf' для просмотра. – amalloy
@amalloy это правильно. обновлено. – OlegTheCat
См. [Это обсуждение] (https://groups.google.com/forum/#!topic/clojure/QbiwXYDw6oA). –