0

最后 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 undefinedand receivedArray.length is undefined。任何想法问题出在哪里?

4

1 回答 1

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 上

于 2014-02-06T01:50:58.557 回答