'Uncaught Error: DATA_CLONE_ERR: DOM Exception 25' выдается веб-работником - PullRequest
17 голосов
/ 22 сентября 2011

Итак, я создаю веб-работника:

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

UPDATE ---------------------------------------------- ----

Это то, что я должен был сделать, основываясь на принятом ответе от @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 для обеспечения совместимости.

Ответы [ 2 ]

22 голосов
/ 22 сентября 2011

Исходное исключение, скорее всего, было сгенерировано, потому что вы пытались передать хост-объект веб-работнику (скорее всего, элемент dom). Ваши последующие попытки не выдают ту же ошибку. Запомните два ключевых момента: между разными потоками нет общей памяти, и веб-работники не могут манипулировать DOM.

postMessage поддерживает передачу структурированных данных в потоки и внутренне сериализует (или каким-либо другим способом копирует значение данных рекурсивно) данные. Сериализация элементов DOM часто приводит к ошибкам циклической ссылки, поэтому лучше всего ставить map объект, который вы хотите сериализовать, и извлекать соответствующие данные, которые будут перестроены в веб-работнике.

0 голосов
/ 03 апреля 2014

Uncaught DataCloneError: An object could not be cloned было воспроизведено при попытке сохранить в indexeddb функцию в качестве ключа объекта. Нужна двойная проверка, чтобы сохраненный объект был сериализуемым

...