JS:是否可以从 webworkers 传输带有对其他对象的引用的对象?

JS: Is it possible to transfer objects with references to other objects from webworkers?

我的部分程序涉及将文本解析为数据结构,该数据结构使用对结构内其他对象的引用。由于它适合程序的方式,它将成为 WebWorkers 的完美候选者,因为它可以在计算其他事情的同时完成,并且不依赖于传递给它的任何其他数据。

让我们使用以下 webworker 代码为例:

self.onmessage = (e) => {
    let a;
    let b;
    let c;

    a = {
        obj1: b,
        obj2: c
    }

    b = {
        obj1: a,
        obj2: a
    }

    c = {
        obj1: b,
        obj2: b
    }

    let myArr = [a, b, c];

    self.postMessage(myArr);
}

目前,如果我在 Web Worker 中生成它并且 return myArr,每个元素的 obj1 和 obj2 都是未定义的。有什么办法可以从 webworker 中获取这些引用吗?

好的,所以我明白了。我误解了引用的工作方式,这导致了我的错误。

问题是我重新分配了对象,并在将它们发回主线程之前破坏了引用。

所以不用

let a;
let b;

a = {ref: b}
b = {ref: a}

在上面的例子中,b开始是未定义的,意思是当我们将它赋值给a.refa.ref = undefined,当我们赋值b.ref = a b 现在是 b = {ref: {ref: undefined}}

为了解决这个问题,我需要确保首先将变量分配给它们的对象

let a = {ref: null}
let b = {ref: null}

a.ref = b;
b.ref = a;

一旦我解决了这个问题,一切似乎都运行良好,更改 b 现在会在主线程中更新 a.ref。如果我刚刚将变量声明为 let a = new SomeClass()

,这也会得到修复

如果您遇到类似问题,请勿使用 JSON.stringify()!一开始它可能看起来有效,但它实际上在做的是深度复制您对其他对象的引用,这意味着对 b 的更改实际上不会更新 a.ref,因为 a.ref 现在是只是 b 的副本,不再是参考。