2013-07-04 8 views
6

Ich versuche ClojureScript auf node.jsClojureScript auf node.js, Code

app1.js Zielcode auszuführen: Arbeits:

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 mein Versuch so weit :

(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 die Ausgabe tatsächliche Kompilierung: nicht funktioniert

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

Der Fehler:

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

Bitte Beratung.


Antwort EDIT

Dank Michal:

(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 Intervall richtig funktioniert, Moment Format Ausgabe wird immer noch, obwohl weired.

Antwort

5

(.Observable rx) ist immer ein Methodenaufruf in ClojureScript; Für den Zugriff auf Eigentum müssen Sie (.-Observable rx) oder vielleicht (aget rx "Observable") verwenden. 1

dies mit daran, Ihre timeStream Definition könnte wie so in ClojureScript neu geschrieben werden:

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

Sie auch js/rxcljs.core.rx.Observable nutzen könnten, wenn Sie diesen schöneren (den js Magie-Namespace finden bewirkt, dass die wörtliche JavaScript-Kennung als Namensbestandteil des Symbols angegeben, das in der kompilierten Ausgabe verwendet werden soll, das bedeutet insbesondere, dass Sie das Namespacepräfix selbst angeben müssen, wie hier gezeigt).


Beachten Sie, dass in Clojure, (.foo x) könnte ein Methodenaufruf oder eine Eigenschaft Zugriff abhängig von der x, so dass eine Differenz zwischen Dialekten ist.

+0

Danke Michal. Ich schaffe es, das Grundlegende zu verstehen, aber dein Code ist ein bisschen verwirrend. Ich poste einen funktionierenden Code. –