2013-07-04 3 views
6
내가 Node.js를

ClojureScript, 코드

에 ClojureScript를 실행하려고

대상 코드를 app1.js :

(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")을 사용해야합니다. 이 예뻐합니다 (js 마법 네임 스페이스를 찾을 경우

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

또한 js/rxcljs.core.rx.Observable를 사용할 수있는 문자 자바 스크립트 식별자의 원인이 마음에와 1

, 당신의 timeStream 정의는 다음처럼 ClojureScript에 다시 작성할 수 있습니다 컴파일 된 출력에 사용될 심볼의 이름 부분으로 주어지며, 특히 여기에 표시된 것처럼 네임 스페이스 접두사를 직접 제공해야 함을 의미합니다. 그 방언의 차이가 그래서 Clojure의에서, (.foo x)는, 메소드 호출 또는 x에 따라 속성 액세스 할 수 있다는


1 참고.

+0

감사합니다. Michal. 기본적인 내용을 이해할 수 있지만 코드가 다소 혼란 스럽습니다. 일부 작동 코드를 게시합니다. –