假设通道chan
在队列中具有值"1“和"2”。
目标:创建一个函数,该函数接受chan
并返回向量[1 2]
。注意,如果这个函数在返回值之前阻塞了一段时间,我完全没问题。
尝试:
(defn chan->vector
[chan]
(let [a (atom true) v []]
(while (not-nil? @a)
(go
(reset! a (<! chan))
(into v @a)
(reset! a (<! chan))
)
) v
)
)
结果: My REPL冻结,并最终输出一个巨大的错误。我逐渐意识到这是因为(go ...)
块是异步的,因此立即返回。因此,我的(while ...)
循环中的原子循环永远不会有机会被设置为nil
,并且循环永远不会终止。
那么我该如何实现预期的结果呢?如果相关,我使用ClojureScript和目标nodejs。
https://stackoverflow.com/questions/34560423
复制相似问题