我正在将一个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))
执行另一个函数并调用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-cljsbuild插件版本0.3.0。并且只有空白优化。
任何提示?
答案 0 :(得分:1)
快速回答ClojureScript Google小组:
问题是地图是懒惰的,来自文档:
返回由应用...
的结果组成的延迟序列
使用repl强制对集合(@ todo-list)上的映射进行评估。建议修复:
(map fn coll)
更改为(doseq coll fn)
(doall (map...
- 如果您想要地图的结果(dorun (map...
- 如果你不就我而言,dorun
完全没问题。