2024年Clojure调查!中分享您的想法。

欢迎!请参阅关于页面以获取更多关于此信息。

0
ClojureScript
编辑

我在我的try/catch的catch形式中得到了一个js/Error。我进行了一些repl工作,以了解关于js/Error的一些内容。我不理解的是为什么(js->clj js-err)仅仅返回相同的js/Error对象。

(def js-err (js/Error. "testing"))

js-err
;; => #object[Error Error: testing]
(js->clj js-err)
;; => #object[Error Error: testing]

评估js-err(js->clj js-err)的结果是一样的。

这里是js-err上的属性

(.getOwnPropertyNames js/Object js-err)
;; => #js["stack" "message"]

我想或期望发生的事情

(js->clj js-err)
;; => {:message "testing"
;;     :stack "blah\nblah"}

有人能解释为什么js->clj不给我想要的对象数据作为地图吗,并且有通常的把对象转换为地图的方式吗?

这是在nodejs主机中

1 个回答

+2

已选中
 
最佳答案

js->clj 只转换普通的 JavaScript 对象和数组。错误是一个子类型,因此不会进行转换。从理论上讲,您可以实现 cljs.core/IEncodeClojure 协议,这样它就会进行转换。默认情况下不执行转换,因为 js/Error 中的堆栈信息在没有任何方式下标准化,因此每个 JS 运行时多少有些自行其是。处理所有这些都有些繁琐,并且会因非常罕见的使用案例而使代码膨胀太多。

即将推出一个 cljs.core/Throwable->map 函数,但我相信它目前还没有发布。在此之前,您可以直接复制它。

...