Node.js上的ClojureScript代码
我正在尝试在node.js上运行ClojureScript
app1.js目标代码:工作:
var rx = require("./lib/rx/rx.node.js"); var moment = require("./lib/moment/moment.js"); var timeStream = new rx.Observable.interval(300) .subscribe(function(index) { console.log(moment().format("dddd, MMMM Do YYYY, h:mm:ss a")); });
core.cljs我的尝试到目前为止:
(ns rxcljs.core (:use [cljs.nodejs :only [require]]) ) (def rx (require "./lib/rx/rx.node.js")) (def moment (require "./lib/moment/moment.js")) (-> rx (.Observable) (.interval 300) (.subscribe #(->> (->(moment) (.format "dddd, MMMM Do YYYY, h:mm:ss a" ) ) (.log js/console) ) ) )
app.js的实际编译输出:不工作
..... ..... cljs.nodejs = {}; cljs.nodejs.require = require; cljs.nodejs.process = process; cljs.core.string_print = cljs.nodejs.require.call(null, "util").print; var rxcljs = {core:{}}; rxcljs.core.rx = cljs.nodejs.require.call(null, "./lib/rx/rx.node.js"); rxcljs.core.moment = cljs.nodejs.require.call(null, "./lib/moment/moment.js"); rxcljs.core.rx.Observable().interval(300).subscribe(function() { return console.log(rxcljs.core.moment.call(null).format("dddd, MMMM Do YYYY, h:mm:ss a")) });
错误:
/...../rxcljs/app.js:12726 rxcljs.core.rx.Observable().interval(300).subscribe(function() { ^ TypeError: Cannot call method 'interval' of undefined
请指教。
回答编辑
感谢米哈尔:
(ns rxcljs.core (:use [cljs.nodejs :only [require]]) ) (def log #(.log js/console %)) (def rx (require "./lib/rx/rx.node.js")) (def moment (require "./lib/moment/moment.js")) (-> rx .-Observable (.interval 300) (.subscribe #(->> (-> (moment) (.format "dddd, MMMM Do YYYY, h:mm:ss a") ) (log) ) ) )
RX时间间隔工作正常,虽然时刻格式输出仍然是weired。
(.Observable rx)
总是ClojureScript中的一个方法调用; 对于财产访问,您必须使用(.-Observable rx)
或者(aget rx "Observable")
。 1
考虑到这一点,您的timeStream
定义可以在ClojureScript中重写,如下所示:
(def time-stream (.. rx -Observable ;; property access (interval 300) ;; method call (subscribe (fn [index] ...))))
如果您发现这个更漂亮的话,您也可以使用js/rxcljs.core.rx.Observable
( js
magic命名空间会导致在编译输出中使用作为符号的名称部分给出的文本JavaScript标识符;特别是,这意味着您需要自己提供名称空间前缀,如下所示)。
1请注意,在Clojure中, (.foo x)
可能是方法调用或取决于x
的属性访问,所以这是方言之间的区别。