#javascript #three.js #indexeddb
#javascript #three.js #indexeddb
Вопрос:
Используя это руководство, я пытаюсь понять, смогу ли я сэкономить пропускную способность с помощью большой сетки, кэшируя ее с помощью IndexedDB.
Итак, внутри функции обратного вызова загрузчика, которую я делаю…
object = new THREE.Mesh( geometry, material );
webkitIndexedDB.open("MyNewDB").onsuccess = function(event) {
window.db = event.srcElement.result;
window.db.setVersion("1.0").onsuccess = function(event) {
var objectStore = window.db.createObjectStore("meshes", { keyPath: "item_id" });
objectStore.add({item_id: 0, mesh: object}); // <= this is the crucial line
};
};
однако последняя строка, в которой объект, содержащий object
, добавляется в базу данных, вызывает следующую ошибку.
Uncaught Error: DATA_CLONE_ERR: DOM Exception 25
Я не уверен, что это на самом деле означает, но должен быть способ обойти это, нет?
Ответ №1:
Это означает, что ваш THREE.Mesh
object
неверно сформирован, но не таким образом, который нарушает индексы, уникальность или что-либо подобное. Я вижу эту ошибку, когда пытаюсь сохранить объекты, которые имеют неисполняемые функции в качестве членов.
Техническое определение из спецификации является:
Хранимые данные не могут быть клонированы внутренним алгоритмом структурированного клонирования.
Если вы пытаетесь сохранить состояние объекта в пространстве имен, вы заблокированы. Если вы храните обычные данные, я бы попробовал выполнить глубокую копию ТРЕХ объектов.Mesh (), проверяющих typeof
на «функцию».
РЕДАКТИРОВАТЬ: я изучил это подробнее. IndexedDB копирует объекты в хранилище объектов, используя алгоритм структурированного клонирования HTML5. Согласно спецификации, объекты Error и Function не могут быть клонированы и выдавать DATA_CLONE_ERR
. Это то, что вы видите.