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.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
的副本,不再是参考。
我的部分程序涉及将文本解析为数据结构,该数据结构使用对结构内其他对象的引用。由于它适合程序的方式,它将成为 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.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
的副本,不再是参考。