Javascript JS:是否可以从webworkers将引用对象转移到其他对象?
我的程序的一部分涉及将文本解析为数据结构,这些数据结构使用对结构中其他对象的引用。由于它在程序中的适用性,它将是WebWorkers的完美候选,因为它可以在计算其他内容时进行,并且不依赖于传递到其中的数据以外的任何其他数据 例如,让我们使用以下webworker代码:Javascript JS:是否可以从webworkers将引用对象转移到其他对象?,javascript,web-worker,Javascript,Web Worker,我的程序的一部分涉及将文本解析为数据结构,这些数据结构使用对结构中其他对象的引用。由于它在程序中的适用性,它将是WebWorkers的完美候选,因为它可以在计算其他内容时进行,并且不依赖于传递到其中的数据以外的任何其他数据 例如,让我们使用以下webworker代码: self.onmessage = (e) => { let a; let b; let c; a = { obj1: b, obj2: c }
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中生成该元素并返回
myArr
,则每个元素的obj1和obj2都未定义。有没有办法从网络工作者那里得到这些参考资料?好的,我想出来了。我误解了参考资料的工作原理,这导致了我的错误
问题是我正在重新分配对象,并在将它们发回主线程之前破坏引用
所以不是
let a;
let b;
a = {ref: b}
b = {ref: a}
在上面的示例中,b
一开始是未定义的,这意味着当我们将其分配给a.ref
,a.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
的一个副本,不再是引用。您能在worker中JSON.stringify(myArr)
吗,然后在主文件中JSON.parse(e.message)
?嗯,奇怪。我以为这就是JS在幕后所做的,但我猜不是。不管怎样,它都不起作用。即使在使用类修改了实例化a、b和c的代码之后,似乎通过树复制了对象值,即:如果我对b
进行更改,那么a.obj1
(引用b)将不会反映该更改