如何在javascript中使用clojurescript中的复杂返回对象

时间:2012-09-10 20:29:35

标签: javascript interop clojurescript

我想编写一个clojurescript函数,它返回一个复杂的项目,如[“foo”“bar”]或(list“foo”“bar”),我希望能够从javascript中调用此函数并获取部分返回值。怎么做到呢?在我的情况下,我正在返回的vector / list / collection中的项目数量是预先知道的,并且该集合应保持有序。

这是我的clojurescript功能。如果它让事情变得更容易,我可以在这里做些不同的事只是不知道会是什么。

(defn myFn [] ["foo" "bar"])

以下是将其编译为javascript后的样子。该部分完全由前一位代码确定/生成。要在这里进行更改,我必须知道如何调整clojurescript中的上一部分。

my.ns.myFn = function myFn() {
  return cljs.core.PersistentVector.fromArray(["foo", "bar"], true)
};

当我在javascript中执行以下操作时,我会看到一个警告框弹出[[foo“”bar“]

alert(my.ns.myFn());

但是,如果我尝试以下操作,警报会显示“未定义”而不是“foo”。

var tmp = my.ns.myFn();
alert(tmp[0]);

我应该采取哪些不同的方式来获取显示“foo”的警报? (嗯。我想我可以编写更多的clojurescript来使用该值,看看在编译为javascript时它是如何出现的......)

2 个答案:

答案 0 :(得分:5)

in clojurescript:

(ns foo.core) (defn ^:export bar [x] (array 0 1 2))

在javascript中:

var result_array = foo.core.bar(x);

...使用result_array作为普通的javascript数组。

答案 1 :(得分:0)

所以我写了更多clojurescript来使用myFn及其返回值。生成的javascript如下所示:

var tmp = my.ns.myFn.call(null);
var first = cljs.core.first.call(null, tmp);
var second = cljs.core.nth.call(null, tmp, 1);