17

所以我正在创建一个网络工作者:

var arrayit = function(obj) {
  return Array.prototype.slice.call(obj);
};
work = arrayit(images);
console.log(work);
//work = images.push.apply( images, array );
// Method : "load+scroll"
var worker = new Worker('jail_worker.js');
worker.postMessage(work)
worker.onmessage = function(event) {
  console.log("Worker said:" + event.data);
};

这是图像:

$.jail.initialStack = this;
// Store the selector into 'triggerEl' data for the images selected
this.data('triggerEl', (options.selector) ? $(options.selector) : $window);
var images = this;

我认为我的问题与此有关:

http://dev.w3.org/html5/spec/Overview.html#safe-passing-of-structured-data

我怎样才能解决这个问题?如您所见,我尝试将主机对象切片成一个真正的数组,但这没有用。

这是我正在破解的文件的链接:

https://github.com/jtmkrueger/JAIL

更新 - - - - - - - - - - - - - - - - - - - - - - - - - -

根据@davin 接受的答案,这是我必须做的:

var arrayit = function(obj) {
  return Array.prototype.slice.call(obj);
};
imgArray = arrayit(images);
work = _.map(images, function(i){ return i.attributes[0].ownerElement.outerHTML; });

var worker = new Worker('jail_worker.js');
worker.postMessage(work)
worker.onmessage = function(event) {
  console.log("Worker said:" + event.data);
};

注意:我使用 underscore.js 来确保兼容性。

4

2 回答 2

22

最初的异常很可能被抛出,因为您尝试将主机对象传递给 web worker(很可能是 dom 元素)。您随后的尝试不会引发相同的错误。记住两个关键点:不同线程之间没有共享内存,并且 web worker 不能操作 DOM。

postMessage支持将结构化数据传递给线程,并将在内部序列化(或以其他方式递归复制数据的)数据。序列化 DOM 元素通常会导致循环引用错误,因此最好的办法是对map要序列化的对象并提取相关数据以在 Web Worker 中重建。

于 2011-09-21T23:17:41.797 回答
0

Uncaught DataCloneError: An object could not be cloned尝试保存到 indexeddb 函数作为对象的键时被复制。需要再次检查保存的对象是否可序列化

于 2014-04-03T14:13:07.027 回答