2013-07-04 31 views
6

我想对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。

回答

5

(.Observable rx)始终是ClojureScript中的一个方法调用;对于物业访问,您必须使用(.-Observable rx)或者(aget rx "Observable")

考虑到这一点,你timeStream定义可以在ClojureScript被重写,像这样:

(def time-stream 
    (.. rx 
     -Observable   ;; property access 
     (interval 300)   ;; method call 
     (subscribe (fn [index] ...)))) 

你也可以使用js/rxcljs.core.rx.Observable如果你发现这个漂亮(的js魔法命名空间使字面的JavaScript标识符作为要在编译输出中使用的符号的名称部分给出;特别是,这意味着您需要自己提供名称空间前缀,如此处所示)。


注意,在Clojure中,(.foo x)可能是一个方法调用或者根据x属性访问,所以这是方言之间的差异。

+0

谢谢Michal。我设法理解基本的,但是你的代码有点混乱。我发布了一些工作代码。 –