0

我正在将一个 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。并且只有空白优化。

有小费吗?

4

1 回答 1

1

在 ClojureScript 谷歌组上得到了一个快速的答案:

问题是地图是懒惰的,来自文档:

返回由应用结果组成的惰性序列...

使用 repl 强制在集合上评估地图(@todo-list)。建议的修复:

  • 将呼叫从 更改(map fn coll)(doseq coll fn)
  • (doall (map...- 如果你想要地图的结果
  • (dorun (map...- 如果你不

就我而言,dorun做得很好。

于 2013-02-25T23:24:03.240 回答