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

WebWorker代码:

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)。

最佳答案

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

我为此提出了一种解决方法:即使数组的长度为零且显然为空,其缓冲区仍然存在,并且如果使用该缓冲区重新实例化数组,则可以访问数据:

// 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/

08-19 14:32