Clojurescript — PersistentArrayMap→对象→PersistentArrayMap —在Web worker之间传输数据

时间:2018-07-29 22:45:09

标签: clojurescript web-worker clojurescript-javascript-interop

我正在尝试将clojurescript映射传递给Webworker。 在通过之前,它的类型为PersistentArrayMap

cljs.core.PersistentArrayMap {meta: null, cnt: 3, arr: Array(6), __hash: null, cljs$lang$protocol_mask$partition0$: 16647951…}

但是,当涉及到工作人员时,它只是一个普通的旧对象

Object {meta: null, cnt: 3, arr: Array(6), __hash: null, cljs$lang$protocol_mask$partition0$: 16647951…}

数据看似完整。此时,我想将其转回PersistentArrayMap,以便可以在cljs中再次使用它。

使用clj->jsjs->clj并不能真正起作用,因为它不能区分关键字和字符串,因此会丢失一些数据。

处理这种情况的最佳方法是什么?我可能会以完全错误的方式进行此操作。

2 个答案:

答案 0 :(得分:1)

您在代码中使用了public static void ChildFromClosed() { //Inform here MessageBox.Show("Child form is closed!"); } 吗?

private void frmChild_FormClosed(object sender, FormClosedEventArgs e)
    {
        //calling the static method in Parents form
        frmParent.ChildFromClosed();
    }

完整文档is here

答案 1 :(得分:1)

内置解决方案是将数据序列化到EDN并读回。 clj->js本质上是有损的,应该避免。

首先将对象转换为字符串,然后将其发送给工作人员。

(pr-str {:a 1})
;; => "{:a 1}"

在工作程序中,您通过cljs.reader/read-string读回它

(cljs.reader/read-string "{:a 1}")
;; => {:a 1}

这通常足够好,但是transit-cljs库会稍快一些。根据您计划发送的数据量,可能值得额外的依赖。