6 clojure node.js clojurescript
我试图在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"));
});
Run Code Online (Sandbox Code Playgroud)
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)
)
)
)
Run Code Online (Sandbox Code Playgroud)
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"))
});
Run Code Online (Sandbox Code Playgroud)
错误:
/...../rxcljs/app.js:12726
rxcljs.core.rx.Observable().interval(300).subscribe(function() {
^
TypeError: Cannot call method 'interval' of undefined
Run Code Online (Sandbox Code Playgroud)
请指教.
回答编辑
感谢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)
)
)
)
Run Code Online (Sandbox Code Playgroud)
rx间隔工作正常,时刻格式输出仍然需要.
(.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] ...))))
Run Code Online (Sandbox Code Playgroud)
你也可以使用,js/rxcljs.core.rx.Observable如果你发现这更漂亮(js魔术命名空间导致文字JavaScript标识符作为符号的名称部分在编译输出中使用;特别是,这意味着你需要自己提供名称空间前缀,如图所示这里).
1请注意,在Clojure中,(.foo x)可能是方法调用或属性访问,具体取决于x方言调用,因此这是方言之间的差异.
| 归档时间: |
|
| 查看次数: |
2343 次 |
| 最近记录: |