【问题标题】:ClojureScript on node.js, codenode.js 上的 ClojureScript,代码
【发布时间】:2013-07-04 16:04:41
【问题描述】:

我正在尝试在 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 间隔正常工作,但时刻格式输出仍然很奇怪。

【问题讨论】:

    标签: node.js clojure clojurescript


    【解决方案1】:

    (.Observable rx) 在 ClojureScript 中始终是一个方法调用;对于属性访问,您必须使用(.-Observable rx)(aget rx "Observable")1

    考虑到这一点,您的 timeStream 定义可以像这样在 ClojureScript 中重写:

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

    如果你觉得这个更漂亮,你也可以使用js/rxcljs.core.rx.Observablejs 魔法命名空间会导致在编译输出中使用作为符号名称部分给出的文字 JavaScript 标识符;特别是,这意味着你需要自己提供命名空间前缀,如此处所示)。


    1请注意,在 Clojure 中,(.foo x) 可能是方法调用或属性访问,具体取决于 x,因此这是方言之间的差异。

    【讨论】:

    • 谢谢米哈尔。我设法理解了基本知识,但是您的代码有点混乱。我发布了一些工作代码。
    猜你喜欢
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多