如何通过 Web Worker 在 JavaScript - postMessage() 中传递可传输对象数组,即缓冲区以及不可传输对象,即 json obj?
How to pass array of transferable objects i.e. buffer along with non transferable object i.e. json obj via web worker in JavaScript - postMessage()?
所以,这就是我想要实现的目标:
- 从 web-worker 调用主线程中的特定函数 onMessage()。
- 传递可传输对象数组,即 Uint16Array 缓冲区、Float32Array 缓冲区等
- 除上述所有内容外,我还想在发布消息时传递一个简单的布尔对象或整数或字符串值。
例如:
const cornersArray = new Uint16Array(5000), // should go as Transferable object
trailsArray = new Float32Array(7000); // should go as Transferable object
const state = 1, // integer
quality = 'High', // string
isTracking = true; // boolean
this.Worker.postMessage({
event: 'ShowTrails',
data: {
cornersArray: cornersArray,
trailsArray: trailsArray,
state: state,
quality: quality,
isTracking: isTracking
}
}, [cornersArray.buffer, trailsArray.buffer]);
因此,主线程的 onMessage() 应该调用 ShowTrails() 并且数据应该作为参数传递。但这是抛出错误,传递的对象不可分离,在 postMessage() 中失败。
我在这方面很菜鸟,第一次使用网络工作者,请帮助我如何实现这一点。我一定是在传递数据的时候做错了。
谢谢!
您没有正确传递可转移缓冲区。试试这个:
this.Worker.postMessage({
event: 'ShowTrails',
data: {
cornersArray: cornersArray.buffer,
trailsArray: trailsArray.buffer,
state: state,
quality: quality,
isTracking: isTracking
}
}, [cornersArray.buffer, trailsArray.buffer]);
所以,这就是我想要实现的目标:
- 从 web-worker 调用主线程中的特定函数 onMessage()。
- 传递可传输对象数组,即 Uint16Array 缓冲区、Float32Array 缓冲区等
- 除上述所有内容外,我还想在发布消息时传递一个简单的布尔对象或整数或字符串值。
例如:
const cornersArray = new Uint16Array(5000), // should go as Transferable object
trailsArray = new Float32Array(7000); // should go as Transferable object
const state = 1, // integer
quality = 'High', // string
isTracking = true; // boolean
this.Worker.postMessage({
event: 'ShowTrails',
data: {
cornersArray: cornersArray,
trailsArray: trailsArray,
state: state,
quality: quality,
isTracking: isTracking
}
}, [cornersArray.buffer, trailsArray.buffer]);
因此,主线程的 onMessage() 应该调用 ShowTrails() 并且数据应该作为参数传递。但这是抛出错误,传递的对象不可分离,在 postMessage() 中失败。
我在这方面很菜鸟,第一次使用网络工作者,请帮助我如何实现这一点。我一定是在传递数据的时候做错了。
谢谢!
您没有正确传递可转移缓冲区。试试这个:
this.Worker.postMessage({
event: 'ShowTrails',
data: {
cornersArray: cornersArray.buffer,
trailsArray: trailsArray.buffer,
state: state,
quality: quality,
isTracking: isTracking
}
}, [cornersArray.buffer, trailsArray.buffer]);