传输一个包含对象的数组

WebWorker - Transferring an array which contains objects

本文关键字:包含 对象 数组 一个 传输      更新时间:2023-09-26

我有一个数组,我需要从WebWorker传输回主线程。据我所知,只有ArrayBuffers和typedarray是可转移的,其他任何东西都是复制的,而不是传输的。

我的问题是数组包含对象,所以我不确定如何传输它们(这是需要由于巨大的大小)。

例如,假设我有:

function something() {
    this.x = 1;
    this.y = 2;
    this.z = 3;
}
var array = [];
for (var x = 0; x < 6; x++) {
    array[x] = new something();
}

是否有一种方法可以将数组转换为ArrayBuffer,然后将其转换回来?

谢谢你的帮助!

考虑在创建对象时对数组(object?)的每个元素进行post。然后将其放入onmessage处理程序中的数组中。

function something() {
    this.x = 1;
    this.y = 2;
    this.z = 3;
}
var array = [];
for (var x = 0; x < 6; x++) {
    postMessage(new something());
}

这应该适用于简单对象,如示例中的对象,但您必须测试边界。

在主页和工作线程之间传递的数据是复制的,而不是共享的。对象在传递给工作线程时被序列化,并且随后,在另一端进行反序列化。page和worker完成不能共享同一个实例,所以最终的结果是一个副本在两端创建。大多数浏览器实现此特性为结构化的克隆。

MDN: Passing Data