【问题标题】:'Uncaught Error: DATA_CLONE_ERR: DOM Exception 25' thrown by web worker“未捕获的错误:DATA_CLONE_ERR:DOM 异常 25”由网络工作者抛出
【发布时间】:2011-11-22 07:50:46
【问题描述】:

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

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 来确保兼容性。

【问题讨论】:

  • 顺便说一句,您是否考虑过这种异步/并行图像/内容分发方法的替代方案? CDN、子域拆分、RequireJS 插件等?
  • 是的,其中一些事情已经发生了。
  • 请注意,过度并行化通常更多的是对性能的拖累而不是增强,所以如果你已经在实现一些东西并且它们还不够好,也许你应该看看它们的工作情况如何...
  • 这是我唯一可以控制的方面,所以我正在努力做到最好。
  • 太糟糕了。你在说什么宿主对象?你到底想向WW传递什么?如果您希望传递由于 WW API 未实现共享内存而无法工作的 jquery 对象,并且尝试复制 Object 会导致传递一个空对象(如您的链接所述)。您需要序列化您不想发送的任何数据。

标签: javascript jquery html dom web-worker


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 解释得很好,切中要害。谢谢,为我节省了大量阅读时间。
    • postMessage 克隆算法支持循环结构
    猜你喜欢
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多