Сравните значения из двух разных магазинов в IndexedDB - PullRequest
0 голосов
/ 01 июня 2019

У меня есть две структуры данных:

  1. Задачи: taskID (автоинкрементный), заголовок, статус, dueDate, описание
  2. Теги: tagID, tagName, tagColor, textColor, taskID

Я пытаюсь сравнить значение taskID для обоих из них, чтобы позже иметь возможность связать одну задачу с несколькими тегами.Я написал две функции, getTags () и getTasks ().Мне удалось пройти через оба из них, получая все объекты в обоих магазинах, однако я не совсем уверен, как проверить, совпадают ли эти два значения.

function connectToDB() {
    window.webkitIndexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;

    //check for support
    if(!window.indexedDB) {
        alert("Your browser do not support indexedDB. Please update you browser.")
    }

    //open database "KanbanDatabase" version 9. 
    //db = database, tx = transaction, store = store data, index = index (seach data).
    let request = window.indexedDB.open("KanbanDatabase", 9), 
        db,
        tx,
        store,
        index;

    //when creating a new databse, a store(structure) must be added
    request.onupgradeneeded = function(e) {
        let db = request.result,
        //tasks
        tasksStore = db.createObjectStore("tasksStore",{
            keyPath: "taskID", autoIncrement: true
        }),
        tasksIndex = tasksStore.createIndex("status", "status", {
            unique: false
        }),
        //tags
        tagsStore = db.createObjectStore("tagsStore", {
            keyPath: "tagID", autoIncrement: true
        }),
        tagsIndex = tagsStore.createIndex("tagID", "tagID", {
            unique: true
        });
    };

    //open database will return response. 
    //error handler:
    request.onerror = function(e) {
        console.error("There was an error opening the database: " + e.target.errorCode);
    };

    //success handler:
    request.onsuccess = function(e) {
        console.log("Successfully connected to DB")
        db = request.result;
        //tasks
        tasksTx = db.transaction("tasksStore", "readwrite");
        tasksStore = tasksTx.objectStore("tasksStore");
        tasksIndex = tasksStore.index("status");

        //tags
        tagsTx = db.transaction("tagsStore", "readwrite");
        tagsStore = tagsTx.objectStore("tagsStore");
        tagsIndex = tagsStore.index("tagID");

        db.onerror = function(e) {
            console.error("ERROR " + e.target.errorCode);
        }


        function tagsToTasks() {
            let amountOfTasks = tasksIndex.count();
            let amountOfTags = tagsIndex.count();

            function getTasks() {
                for (var i = 1; i < amountOfTasks.result+1; i++) {
                    let getTasks = tasksStore.get(i);

                    getTasks.onerror = function() {
                        console.error("There was an error looping through the tasks");
                    }

                    getTasks.onsuccess = function() {
                        console.log(getTasks.result.taskID)
                    }
                }
            }

            function getTags() {
                for (var j = 1; j < amountOfTags.result+1; j++) {
                    let getTags = tagsStore.get(j);

                    getTags.onerror = function() {
                        console.error("There was en error looping through the tags");
                    }

                    getTags.onsuccess = function() {
                        let result = getTags.result.taskID;

                        return result;
                    }
                }
            }

            function compareID() {
                //what to do?
            }

            amountOfTasks.onerror = function() {
                console.error("There was an error finding the amount of tasks");
            }

            amountOfTasks.onsuccess = function() {
                getTasks();
            }

            amountOfTags.onerror = function() {
                console.error("There was an error finding the amount of tags");
            }

            amountOfTags.onsuccess = function() {
                getTags();
            }

        }


        //fire functions
        tagsToTasks();
        listTasks();

        //close DB conection once transaction is complete.
        tasksTx.oncomplete = function() {
            db.close();
        }

        tagsTx.oncomplete = function() {
            db.close();
        }
    }
}

Редактировать: , чтобы уточнить: мне нужно сравнить два значения в двух разных магазинах.Проблема начинается с функции tagsToTasks ();Как я могу сравнить значения, возвращенные из getTags.result.taskID в функции getTags () с getTasks.result.taskID в функции getTasks ()?

1 Ответ

0 голосов
/ 01 июня 2019

Первая ошибка здесь.

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.

...