2013-07-04 4 views
6

Я пытаюсь запустить ClojureScript на Node.jsClojureScript на Node.js, код

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 

Пожалуйста, советы.


Ответ EDIT

Благодаря 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) 
       )  
    ) 
) 

интервал гх работает нормально, выходной формат момент еще 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. Мне удается понять основные, но ваш код немного запутан. Я размещаю некоторый рабочий код. –

Смежные вопросы