1

这是一个 fiddle,它在 Chrome 上显示 100,在 FireFox 上显示 0。两者都在最新的稳定版本上进行了测试。

网络工作者代码:

self.onmessage = function(event) {
    postMessage({len: event.data.arr.length});
};

主要代码:

var worker = new Worker("worker.js");

worker.onmessage = function(event) {
    console.log(event.data);
};

var arr = new Uint8Array(100);

worker.postMessage({
    arr: arr
}, [arr.buffer]);

两者都支持可转移阵列。如果我删除[arr.buffer]它发送它的参数很好,但是我失去了性能增益,它会恢复到结构化克隆。

我怎样才能使这在两个浏览器上都能工作,同时保持可转移的行为?

(顺便说一句,我实际上使用了多个数组,它们总共大约 10MB)。

4

1 回答 1

1

我刚刚经历过这个并问了一个问题,这是一个错误还是设计使然。

我想出了一个解决方法:即使数组的长度为零并且显然是空的,它的缓冲区仍然存在,如果你用那个缓冲区重新实例化你的数组,你可以访问你的数据:

// page:
worker.postMessage({
  arr: arr
}, [arr.buffer]);

// worker:
self.onmessage = function(event) {
  var arr = new Uint8Array(event.data.arr.buffer);
  postMessage({len: event.data.arr.length, arrLen: arr.length});
};

这是一个工作小提琴:http: //jsfiddle.net/HLpwV/3/

于 2013-12-21T05:00:21.397 回答