1

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

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

例如假设我有:

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,将其传输然后再转换回来?

谢谢您的帮助!

4

1 回答 1

0

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

function something() {
    this.x = 1;
    this.y = 2;
    this.z = 3;
}

var array = [];
for (var x = 0; x < 6; x++) {
    postMessage(new something());
}

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

主页和工作人员之间传递的数据是复制的,而不是共享的。对象在交给工作人员时会被序列化,然后在另一端反序列化。页面和工作人员不共享同一个实例,因此最终结果是在每一端都创建了一个副本。大多数浏览器将此功能实现为结构化克隆。

MDN:传递数据

于 2013-06-06T02:28:42.283 回答