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。

       

网上收集的解决方案 "Node.js上的ClojureScript代码"

(.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.Observablejs magic命名空间会导致在编译输出中使用作为符号的名称部分给出的文本JavaScript标识符;特别是,这意味着您需要自己提供名称空间前缀,如下所示)。


1请注意,在Clojure中, (.foo x)可能是方法调用或取决于x的属性访问,所以这是方言之间的区别。