0

TODO アプリをバニラ 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]>)

これにより、実際に TODO リストの内容が画面に追加されます。lein-cljsbuild プラグイン バージョン 0.3.0 を使用しています。空白の最適化のみ。

任意のヒント?

4

1 に答える 1

1

ClojureScript Google グループで簡単な回答を得ました。

問題は、ドキュメントからのマップが怠惰であるということでした:

を適用した結果で構成される遅延シーケンスを返します...

repl を使用すると、コレクション (@todo-list) に対するマップの評価が強制されます。推奨される修正:

  • 通話を から(map fn coll)に変更(doseq coll fn)
  • (doall (map...- マップの結果が必要な場合
  • (dorun (map...- そうでない場合

私の場合、dorun完全にうまくいきました。

于 2013-02-25T23:24:03.240 に答える