【问题标题】:How to pass a global array to web worker and return it?如何将全局数组传递给 web worker 并返回它?
【发布时间】:2014-03-02 18:25:35
【问题描述】:

过去 30-40 分钟,我试图了解将数组传递给网络工作者并返回它的确切工作原理。目前我执行以下操作:

var myglobalarray = [1, 2, 3, 4, 5];
var code = 'self.addEventListener("message", function(e) {' + 
'  var receivedArray = e.data.buffer;' + 
'  var receivedArraysize = receivedArray.length;' + 
'  //doSomethinWithreceivedArray here...' + 
'  self.postMessage(receivedArray, [receivedArray]);' + 
'}, false);';
var blob = new Blob([code], {type: 'text/javascript'});
var blobURL = window.URL.createObjectURL(blob);
var worker = new Worker(blobURL);

worker.addEventListener('message', function(e) {
  var returnedArray = e.data;
  myglobalarray.length = 0;
  myglobalarray = e.data.slice();
}, false);

var passedArray = new ArrayBuffer(myglobalarray);
worker.postMessage(passedArray, [passedArray]);

但仍然得到receivedArray is undefinedreceivedArray.length is undefined。任何想法问题出在哪里?

【问题讨论】:

  • 你为什么尝试使用ArrayBuffer
  • 读到这是一种保存全局数组的方法,因为我有另一个使用它的全局函数
  • myglobalarray 被保留,调用postMessage 将克隆数组。你可能想read the docs?
  • 好的,但我仍然收到空数组元素

标签: javascript blob web-worker postmessage arraybuffer


【解决方案1】:

一个简单的例子,数据是 JSON 序列化

var blob = new Blob(["self.addEventListener('message', function(e) { postMessage(e.data); }, false);"]),
    blobURL = window.URL.createObjectURL(blob),
    worker = new Worker(blobURL);

worker.addEventListener('message', function (e) {
    console.log(e.data);
}, false);

worker.postMessage([1, 2, 3]);

开启jsFiddle

或者也许这就是你真正想要的,缓冲区被转移了?您的标题/问题不清楚。

var blob = new Blob(["self.addEventListener('message', function(e) { postMessage(e.data, [e.data]); }, false);"]),
    blobURL = window.URL.createObjectURL(blob),
    worker = new Worker(blobURL),
    myArray = [1, 2, 3, 4, 5],
    bufView = new Int8Array(myArray.length);

bufView.set(myArray);
worker.addEventListener('message', function (e) {
    console.log('transferred buffer in new view:', new Int8Array(e.data));
}, false);

worker.postMessage(bufView.buffer, [bufView.buffer]);
console.log('myArray - preserved:', myArray);
console.log('bufView - cleared by transfer:', bufView);

开启jsFiddle

【讨论】:

  • 只是传递它,而不是转移,因为它将按照文档中的说明被清除。问题是工人数组返回的是空的,这在我的情况下导致碰撞检测不工作(试图线程一个标准的离散圆碰撞)。您的最后一次编辑对我也不起作用:(我应该在某处发布整个代码(它适用于当前的非工作版本)吗?
  • 在使用 Chromium v​​27、Chrome v32 和 FireFox v26 时,我的两个示例都适用。你确定你使用的浏览器支持传输?在您的原始代码中,您没有在缓冲区中设置任何值,因此长度为 0 并且不包含任何内容。 The ArrayBuffer is a data type that is used to represent a generic, fixed-length binary data buffer. You can't directly manipulate the contents of an ArrayBuffer; instead, you create an ArrayBufferView object which represents the buffer in a specific format, and use that to read and write the contents of the buffer.
  • 是的,FF v27 和 Chrome 32.0.1700.107m,但仍然得到空的返回数组,在 Firebug 中没有一个错误或警告......顺便说一句,对于这种情况,我认为最简单且无问题的方法是@Bergi 指出的 - 使用结构化克隆。
  • 那将是我的第一个例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
  • 1970-01-01
  • 2018-09-23
相关资源
最近更新 更多