Fn不会更新DOM,除非从浏览器连接的REPL调用

Fn不会更新DOM,除非从浏览器连接的REPL调用,dom,clojurescript,Dom,Clojurescript,我正在将TODO应用程序从vanilla JavaScript移植到ClojureScript。到目前为止一切都很好,除了这个看起来很天真的功能: ;; loop the @todo-list, write each todo at the end of the <body> (defn show-todos [] (js/alert "in show-todos") (map #(appendChild (.-body js/document) (.createTex

我正在将TODO应用程序从vanilla JavaScript移植到ClojureScript。到目前为止一切都很好,除了这个看起来很天真的功能:

;; loop the @todo-list, write each todo at the end of the <body>
(defn show-todos []
  (js/alert "in show-todos")
  (map
   #(appendChild (.-body js/document) (.createTextNode js/document (str %)))
   @todo-list))
;;循环@todo列表,将每个todo写在
(defn显示待办事项[]
(js/alert“展示待办事项中”)
(地图
#(appendChild(.-body js/document)(.createTextNode js/document(str%))
@待办事项清单)
执行另一个函数,它调用show todos,浏览器显示警报消息,但不会对文档进行任何更新。但是,如果我打开另一个终端并启动浏览器连接的repl:

$ lein trampoline cljsbuild repl-listen
Running ClojureScript REPL, listening on port 9000.
"Type: " :cljs/quit " to quit"
ClojureScript:cljs.user> (in-ns 'todo-cljs.todos)
ClojureScript:todo-cljs.todos> (show-todos)
(#<[object Text]>)
$lein trampoline cljsbuild repl listen
正在运行ClojureScript REPL,在端口9000上侦听。
类型:“:cljs/quit”以退出
ClojureScript:cljs.user>(在ns'todo cljs.todos中)
ClojureScript:todo cljs.todos>(显示todos)
(#)
这实际上会在屏幕上添加todo列表的内容。我使用的是lein cljsbuild插件版本0.3.0。而且只有空格优化


有什么建议吗?

在ClojureScript Google group上得到了一个快速的答案:

问题是,map是懒惰的,从文档中可以看出:

返回由应用的结果组成的延迟序列

使用repl强制对集合(@todo list)上的映射求值。建议的修复方法:

  • 将呼叫从
    (map fn coll)
    更改为
    (doseq coll fn)
  • (doall(映射…
    )-如果需要映射结果
  • (多伦(地图…
    )-如果你没有
就我而言,
dorun
做得很好