ClojureScript在node.js上的应用,代码

6

我正在尝试在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

请给予建议。


答案更改

感谢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间隔正常工作,但是时间格式输出仍然有点奇怪。

1个回答

4

(.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.Observable,如果您觉得这更加清晰明了(js魔术命名空间会将作为符号名称的文本JavaScript标识符用于编译输出;特别地,这意味着您需要自己提供命名空间前缀,正如此处所示)。


1 请注意,在Clojure中,(.foo x)可能是一个方法调用或属性访问,这是方言之间的区别。


谢谢Michal。我已经理解了基本概念,但是你的代码有点令人困惑。我会发布一些可行的代码。 - user1028880

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接