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