Clojure 如何建模Rx';s`withLatestFrom`与core.async通道?

Clojure 如何建模Rx';s`withLatestFrom`与core.async通道?,clojure,core.async,Clojure,Core.async,例如,给定一个具有操作的通道和另一个具有数据的通道,如何编写一个将操作应用于数据通道上最后一个值的go块 (go-loop [] (let [op (<! op-ch) data (<! data-ch)] (put! result-ch (op data)))) (循环[] (让[op]( 显然,这不起作用,因为它需要两个通道具有相同的频率 (请参阅)使用您可以完成您想要的 下面显示的带有最新from的实现了from RxJS中的相同行为(我认为:p)

例如,给定一个具有操作的通道和另一个具有数据的通道,如何编写一个将操作应用于数据通道上最后一个值的
go

(go-loop []
  (let [op (<! op-ch)
        data (<! data-ch)]
    (put! result-ch (op data))))
(循环[]
(让[op](
显然,这不起作用,因为它需要两个通道具有相同的频率

(请参阅)

使用您可以完成您想要的

下面显示的带有最新from的
实现了from RxJS中的相同行为(我认为:p)

(需要“[clojure.core.async:as async]”
(def op ch(异步/信道))
(def数据通道(异步/通道))
(定义,最新版本自[chs f]
(让[结果ch(异步/通道)
最新(vec(重复(计数chs)无))
索引(到{}(映射向量chs(范围)))]
(异步/go循环[最新]
(let[[value ch](异步/alts!chs)
最新(关联最新(索引ch)值)]
(如果不是(一些为零?最新)
(异步/put!结果ch(应用于最新版本)))
(当值(最新重现)时)
结果(见附件)
(def结果ch(带有[op ch data ch]str的最新数据))
(异步/去循环[]

(prn(async/有一个
:priority true
选项用于
alts!

始终返回某个通道中最近看到的值的表达式如下所示:

(def in-chan (chan))

(def mem (chan))

(go (let [[ch value] (alts! [in-chan mem] :priority true)]
    (take! mem)      ;; clear mem (take! is non-blocking)
    (>! mem value)   ;; put the new (or old) value in the mem
    value            ;; return a chan with the value in
它未经测试,可能效率不高(一个
volatile
变量可能更好)。
go
-块返回一个只有值的通道,但可以扩展到某个“记忆”通道