"Неиспользуемая ошибка: DATA_CLONE_ERR: исключение DOM 25", брошенное веб-работником
Итак, я создаю веб-исполнителя:
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 для обеспечения совместимости.
Ответы
Ответ 1
Исходное исключение, скорее всего, было выбрано потому, что вы пытались передать объект-хост веб-работнику (скорее всего, элемент dom). Ваши последующие попытки не выдают ту же ошибку. Помните два ключевых момента: между различными потоками нет разделяемой памяти, и веб-рабочие не могут манипулировать DOM.
postMessage
поддерживает передачу структурированных данных в потоки и внутренне сериализует (или каким-либо другим способом копирует значение данных рекурсивно) данные. Сериализация элементов DOM часто приводит к циклическим опорным ошибкам, поэтому наилучшим вариантом является map
объект, который вы хотите сериализовать, и извлеките нужные данные для веб-пользователя.
Ответ 2
Uncaught DataCloneError: An object could not be cloned
был воспроизведен, когда попытался сохранить функцию indexeddb в качестве ключа объекта. Нужно дважды перепроверять, что сохраненный объект сериализуем