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 中的堆栈信息没有在任何方式上标准化,所以不同的 JavaScript 运行时基本上是各自为政的。处理所有这些略显繁琐,并且会让代码在非常罕见的用例中过于庞大。

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

...