Javascript:如何使用带有视图的数组缓冲区来发送可传输的对象

时间:2017-11-10 01:16:00

标签: javascript arrays web-worker arraybuffer transferable

假设我有一个名为

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

并且第一个数组具有2000个具有以下

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

假设我想将Arr2定义为

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

然后将arr2发送给Web worker。

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

这样的东西
transform

这就是创造我想要的东西,如果没有,我怎样才能将我的物品转移给工人,谢谢你的爆炸。

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

1 个答案:

答案 0 :(得分:0)

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

window线程使用Worker TextDecoder()方法和.decode()获取转移的对象。在JSON.parse()事件中将对象定义为Worker对象的属性。

执行将对象转换为字符串并转换为message以获取TypedArray ArrayBuffer属性的相同任务,以将.buffer普通对象的表示转移到ArrayBufferWindow delete的财产。

Worker

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

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