Javascript 处理无限时滞序列

Javascript 处理无限时滞序列,javascript,settimeout,setinterval,clojurescript,seq,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 (in

我如何处理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)

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

例如,这可以:

(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)

计数器只是一个例子——我最好奇的是如何从一个异步上下文(如setInterval.OK)中遍历一个seq,然后简单的递归传递其余的内容就可以了。由于我们将进入另一个事件循环过程,所以我们不会破坏堆栈。