Первая ошибка здесь.
window.webkitIndexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;`
Вы присваиваете ее window.webkitIndexedDb
, но проверяете на window.indexedDb
в следующей строке.
Я бы предложил использовать локальную константувместо попытки перезаписать глобальные переменные.
Примерно так:
const indexedDb = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
if (!indexedDb) return ....
Далее вы можете использовать метод cursor
или getAll
для извлечения всех объектов.Кроме того, вы не можете вернуть задачу из обработчика событий onSuccess
, вам необходимо присвоить ей переменную из родительской области.Таким образом,
let tasks = [];
tasksStore.getAll().onsuccess = function(event) {
tasks = event.target.result
attachTags(tasks);
};
function attachTags(tasks) {
tags.openCursor().onsuccess = function(event) {
var cursor = event.target.result;
if (cursor) {
const task = tasks.find(t => t.taskId == cursor.value.taskId);
if (!task.tags) task.tags = []
task.tags.push(cursor.value) ;
cursor.continue();
}
else {
return;
}
};
}
выглядит так, как будто вам придется пройти через ад обратного вызова, чтобы сделать это.Я использую метод find
, чтобы выбрать задачу с идентификатором задачи текущего тега, на который указывает cursor
в cursor.value
, а затем я создаю массив тегов для этой задачи и помещаю в нее теги.Глядя на вашу модель данных, я предположил, что вы хотите связать каждый тег с соответствующей задачей через внешний ключ taskId.
Проблема с тем, как вы настроили вещи, заключается в том, что indexedDB использует обратные вызовы для возврата значений инигде в вашем коде вы не сохраняете эти значения и не переходите к функциям, которые в них нуждаются.Вы написали обратные вызовы, которые по сути ничего не делают с полученными значениями.Вы не можете вернуть значение из обратного вызова, потому что обратный вызов вызывается API, а не вашим кодом.вам нужно присвоить значения переменным вне обратного вызова или выполнить обработку внутри обратного вызова.Обратные вызовы выполняются асинхронно друг другу, поэтому нет гарантии, что ваш код будет выполняться в последовательности, в которой вы его написали, что не оставляет вам выбора, кроме как установить следующий обратный вызов из текущего обратного вызова, это называется адом обратного вызова,Обещания помогают облегчить это, поэтому, если вы собираетесь использовать это в работе, я бы порекомендовал такую библиотеку, как https://github.com/jakearchibald/idb, которая предоставляет более удобный для использования Api.