2013-07-04 24 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。我設法理解基本的,但是你的代碼有點混亂。我發佈了一些工作代碼。 –