我正在尝试将数据从webworker传递到主要上下文,但我无法使其工作。我的代码是:
alg.OnProcessEnd = (arg: { array: Uint32Array, max: number }) => {
(<any>self).postMessage(arg, [arg.array]);
};
但Chrome声称“TypeError:'在'WorkerGlobalScope'上执行'postMessage'失败':索引0处的值没有可转移类型。”
所以我的问题是:如何从我无法复制的webworker中正确发送数据(图像数据数组)。
答案 0 :(得分:4)
您需要首先序列化Uint32Array
,将其转移,然后反序列化。
这样做的一种方法是通过执行以下操作将其转换为JSON数组:
var jsonArray = '[' + Array.prototype.join.apply(arg.array, [',']) + ']';
然后你可以通过以下方式转移它并重新创建Uint32Array
对象:
var uint32Array = new Uint32Array( JSON.parse(jsonArray) );
修改强>
作为可转让对象:您错过了buffer
属性。
(<any>self).postMessage(arg, [arg.array.buffer]);
答案 1 :(得分:0)
第二个参数应该是缓冲区,而不是数组本身
alg.OnProcessEnd = (arg: { array: Uint32Array, max: number }) => {
(<any>self).postMessage(arg, [arg.array.buffer]);
};