将传感器应用于事件回调流

时间:2017-03-25 17:10:50

标签: clojurescript

我正在编写一些正在进行日志处理的clojurescript。我正在包装一个Javascript库,只要新的日志条目到达就会给我一个回调,即

(.on my-logs-source "log-entry" handle-log-event)

我想使用clojure' partition-by函数对这些事件执行一些简单的聚合,这些函数会返回一个传感器,并获得结果的向量。将我的事件回调流转换为可以应用换能器的东西的惯用方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以使用clojure.async - 它的通道可选择在构造时接受传感器。

以下示例说明了如何实现目标。

(require '[clojure.core.async :as async])

(def ch (async/chan 1 (partition-by odd?)))

(def callback (fn [n] (async/put! ch n)))

(async/go-loop []
  (when-some [v (async/<! ch)]
    (println "Got" v)
    (recur)))

(callback 1)
(callback 1)
(callback 2)
(callback 2)
(callback 3)
(callback 4)

上面的代码将创建一个带换能器的通道。您的回调函数会将收到的所有值发送到该频道。 go块将在通道可用时消耗它们的值。通道消耗的值是传感器产生的结果。

对于上面的示例REPL会话,来自go块的控制台输出将如下:

Got [1 1]
Got [2 2]
Got [3]

现在关闭频道时:

(async/close! ch)

其余数据将从您的传感器中“刷新”:

Got [4]