2014-02-06 40 views
0

持续30-40分钟我想知道如何将一个数组传递给一个web worker并返回它。目前我做到以下几点:如何将全局数组传递给web worker并将其返回?

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。任何想法是哪里的问题?

+0

为什么你尝试使用'ArrayBuffer'? – Bergi

+0

阅读这是一种保存全局数组的方法,因为我有另一个使用它的全局函数 – 1000Gbps

+0

保留'myglobalarray',调用'postMessage'将它克隆到数组。您可能需要[阅读文档](https://developer.mozilla.org/en-US/docs/Web/API/Worker.postMessage)? – Bergi

回答

0

一个简单的例子,数据是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

+0

只是为了通过它,不传输原因它将被清除为文档中写入。问题是由worker数组返回的是空的,这导致在我的情况下不工作的碰撞检测(尝试线程标准离散的圆碰撞)。你最后的编辑对我来说不适用:我应该在某处发布整个代码(它适用于当前非工作者版本)吗? – 1000Gbps

+0

当我使用Chromium v​​27,Chrome v32和FireFox v26时,我的例子都适用于我。确定你使用的浏览器支持可转换的东西?在你的原始代码中,你不需要在缓冲区中设置任何值,所以长度为0并且不包含任何东西。ArrayBuffer是一种数据类型,用于表示一个通用的,固定的-length二进制数据缓冲区,不能直接操作ArrayBuffer的内容,而是创建一个以特定格式表示缓冲区的ArrayBufferView对象,并使用它读取和写入缓冲区的内容。' – Xotic750

+0

[ ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/API/ArrayBuffer) – Xotic750

相关问题