2013-07-04 12 views
6

Próbuję uruchomić ClojureScript na node.jsClojureScript na node.js, kod

app1.js docelowego kodu: Praca:

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 moja próba tak daleko :

(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 rzeczywiste wyjście kompilacji: nie działa

..... 
..... 
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")) 
}); 

Błąd:

/...../rxcljs/app.js:12726 
rxcljs.core.rx.Observable().interval(300).subscribe(function() { 
          ^
TypeError: Cannot call method 'interval' of undefined 

Proszę o poradę.


Odpowiedź EDIT

Dzięki Michał:

(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) 
       )  
    ) 
) 

przedział RX działa prawidłowo, wyjście Format chwila wciąż weired chociaż.

Odpowiedz

5

(.Observable rx) jest zawsze wywołaniem metody w ClojureScript; aby uzyskać dostęp do nieruchomości, musisz użyć (.-Observable rx) lub być może (aget rx "Observable").

Mając to na uwadze, definicja timeStream może być przepisany w ClojureScript tak:

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

Można również użyć js/rxcljs.core.rx.Observable jeśli okaże się to ładniejszy (magic nazw z js powoduje dosłowne identyfikator JavaScript podana jako część nazwy symbolu, która ma być użyta w skompilowanym wyjściu, w szczególności oznacza to, że musisz przedłożyć prefiks przestrzeni nazw, jak pokazano tutaj).


Należy zauważyć, że w Clojure, (.foo x) może być wywołanie metody lub dostępu nieruchomość w zależności od x, tak że różnica między dialektami.

+0

Dzięki Michał. Udaje mi się zrozumieć podstawowe, ale twój kod jest trochę zagmatwany. Publikuję działający kod. –

Powiązane problemy