将数据从网络工作者发送到站点上下文失败
Sending datas from webworker to site context failing
我正在尝试将数据从 webworker 传递到主上下文,但我无法让它工作。我的代码是:
alg.OnProcessEnd = (arg: { array: Uint32Array, max: number }) => {
(<any>self).postMessage(arg, [arg.array]);
};
但是 chrome 声称 "TypeError: Failed to execute 'postMessage' on 'WorkerGlobalScope': Value at index 0 does not have a transferable type."
所以我的问题是:如何从无法复制的 webworker 正确发送数据(图像数据数组)。
需要先序列化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]);
第二个参数应该是缓冲区而不是数组本身
alg.OnProcessEnd = (arg: { array: Uint32Array, max: number }) => {
(<any>self).postMessage(arg, [arg.array.buffer]);
};
我正在尝试将数据从 webworker 传递到主上下文,但我无法让它工作。我的代码是:
alg.OnProcessEnd = (arg: { array: Uint32Array, max: number }) => {
(<any>self).postMessage(arg, [arg.array]);
};
但是 chrome 声称 "TypeError: Failed to execute 'postMessage' on 'WorkerGlobalScope': Value at index 0 does not have a transferable type."
所以我的问题是:如何从无法复制的 webworker 正确发送数据(图像数据数组)。
需要先序列化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]);
第二个参数应该是缓冲区而不是数组本身
alg.OnProcessEnd = (arg: { array: Uint32Array, max: number }) => {
(<any>self).postMessage(arg, [arg.array.buffer]);
};