处理具有延迟的无限序列

时间:2014-05-13 23:35:35

标签: javascript settimeout setinterval clojurescript seq

如何处理ClojureScript中的无限序列,对每个元素执行DOM操作,然后在继续之前等待一段时间(例如,如果我想在显示每秒递增一次的数字的页面上设置div )?

使用dommy库进行DOM交互,这是一个(非工作)代码示例:

(def container (sel1 :#container))

(defn integers [] (iterate inc 0))

(js/setInterval
  (fn []
    (dommy/set-text! container (nth (integers) i)) ; whence i?
    )
  1000)

显然,索引这个序列不是一个长期的解决方案。

1 个答案:

答案 0 :(得分:1)

例如,这可以起作用:

(def container (sel1 :#container))

(def integers (iterate inc 0))

(defn set-int! [[x & rs :as nums]]
  (when nums
    (js/setTimeout
      #(do (dommy/set-text! container i)
           (set-int! rs))
      1000)))

(set-int! integers)

无论如何,你想要完成什么?制作一个计数器是一种非常奇怪的方式,你将用无限的序列来吹嘘记忆。

使用原子可以更加清洁和高效:

(def container (sel1 :#container))
(def set-int! (partial dommy/set-text! container))

(def counter (atom 0))

(js/setInterval
  #(do (swap! counter inc)
       (set-int! @counter))
  1000)