0

假设我有一个名为的数组

(Arr1,Arr2) 

第一个数组有 2000 个对象,它们具有以下内容

{Cyclic:my.parent,string:"imAString",int:10,Position:{bunchofints}}

假设我想将 Arr2 定义为

for (i in arr1){let arr1[i]= currentObject   arr2.push(currentObject.Position)}

然后将 arr2 发送给网络工作者。

这就是目标,我想知道我将如何去做,首先发送并访问第一个数组,然后再做另一个。这和 ik 有可以定义的数组缓冲区,然后可以从缓冲区制作数据视图,但我不知道你将如何将我上面的内容发送给工作人员,因为我不知道需要发送什么缓冲区以及如何添加必要的限制,如字节长度。我看到一个帖子,那个家伙使用了类似的东西

    var arrayBuffer = new ArrayBuffer("?what should go here");
    var data = new DataView(arrayBuffer);
    var tempArray = new Float32Array(data.byteLength/Float32Array.BYTES_PER_ELEMENT);  

这是在创造我想要的东西吗?如果不是,我怎么能把我的物品转移给工人,谢谢,玩得开心。

Ps:我做这个帖子的原因是为了简化已经存在的信息,我认为这些信息对新人来说有点笼统和不受欢迎。

4

1 回答 1

0

您可以使用JSON.stringify()将 JavaScript 普通对象转换为字符串的TextEncoder() .encode()方法将字符串转换为 a Uint8Array,将Uint8Array .buffer属性传递给 的第二个参数postMessage(),然后delete将原始对象定义为的属性window或其他对象。

AtWorker线程使用TextDecoder() .decode()方法并JSON.parse()获取传输的对象。将对象定义为事件Worker内对象的属性。message

执行将对象转换为字符串和转换为TypedArray获取属性的相同任务,以将ArrayBuffer普通对象的表示转移到的属性。.bufferArrayBufferWindowdeleteWorker

window

this.data = {Cyclic:123,string:"imAString",int:10,Position:{a:1, b:2, c:3}};

const worker = new Worker("worker.js");    
const encoder = new TextEncoder();    
const decoder = new TextDecoder();

worker.onmessage = e => {
  console.log(e.data)
}

console.log("original data in Window:", this.data);

this.encoded = encoder.encode(JSON.stringify(this.data));

worker.postMessage(this.encoded, [this.encoded.buffer]);

delete this.data;
delete this.encoded;

console.log("data deleted in Window:", this.data, this.encoded);

worker.onmessage = e => {
  this.data = JSON.parse(decoder.decode(e.data));
  console.log("data in message event at window:", this.data);
}

Worker

const decoder = new TextDecoder();
const encoder = new TextEncoder();

self.onmessage = e => {
  console.log(e.data);
  self.data = JSON.parse(decoder.decode(e.data));
  self.data.string = "imAStringToo";
  self.encoded = encoder.encode(JSON.stringify(self.data));
  console.log("data in Worker:", self.data);
  self.postMessage(self.encoded, [self.encoded.buffer]);
  delete self.data; 
  delete self.encoded;
  console.log("data deleted in Worker:", self.data, self.encoded);
}

plnkr http://plnkr.co/edit/my7GS0XRC5iEwjL0I2th?p=preview

于 2017-11-10T02:58:54.010 回答