如何在IndexedDB transaction.oncomplete()执行后检索变量?

rkkpypqq  于 2022-12-09  发布在  IndexedDB
关注(0)|答案(1)|浏览(154)

我的问题很简单,但令人难以置信的沮丧,因为我现在已经是第二个星期试图弄清楚这个问题了,几乎要放弃了。我想在执行transaction.oncomplete()侦听器后,在getAllNotes()函数之外检索我的'notesObject'变量。

(function() {
        // check for IndexedDB support
        if (!window.indexedDB) {
            console.log(`Your browser doesn't support IndexedDB`);
            return;
        }

        // open the CRM database with the version 1
        let request = indexedDB.open('Notes', 1);

        // create the Contacts object store and indexes
        request.onupgradeneeded = (event) => {
            let db = event.target.result;

            // create the Notes object store ('table') 
            let store = db.createObjectStore('Notes', {
                autoIncrement: true
            });

            // create an index on the sections property.
            let index = store.createIndex('Sections', 'sections', {
                unique: true
            });

        }

        function insertData() {
            let myDB = indexedDB.open('Notes');

            myDB.onsuccess = (event) => {
                // myDB.transaction('Notes', 'readwrite')
                event.target.result.transaction('Notes', 'readwrite')
                    .objectStore('Notes')
                    .put({
                        sections: "New Note",
                        pages: "New page",
                        lastSelectedPage: ""
                    });

                console.log("insert successful");
            }

            myDB.onerror = (event) => {
                console.log('Error in NotesDB - insertData(): ' + event.target.errorCode);
            }

            myDB.oncomplete = (event) => {
                myDB.close();
                console.log('closed');
            }
        }

        insertData()

        function getAllNotes() {
            let myDB = indexedDB.open('Notes');
            let notesObject = [];

            myDB.onsuccess = (event) => {
                let dbObjectStore = event.target.result
                    .transaction("Notes", "readwrite").objectStore("Notes");

                dbObjectStore.openCursor().onsuccess = (e) => {
                    let cursor = e.target.result;

                    if (cursor) {
                        let primaryKey = cursor.key;
                        let section = cursor.value.sections;

                        notesObject.push({
                            primaryKey,
                            section
                        })
                        cursor.continue();
                    }
                }

                dbObjectStore.transaction.onerror = (event) => {
                    console.log('Error in NotesDB - getAllData() tranaction: ' + event.target.errorCode);
                }

                dbObjectStore.transaction.oncomplete = (event) => {
                    return notesObject; 
                    console.log(notesObject) 
                }
            }

        }

        let notes = getAllNotes()
        console.log("Getting Notes sucessful: " + notes)

    })()

我试过设置全局变量,但似乎没有任何效果。我是一个完全的菜鸟,老实说,我完全不知道如何在getAllNotes()函数之外检索notesObject变量。我得到的结果是“未定义”。任何帮助都将非常感谢。

l7mqbcuq

l7mqbcuq1#

这实际上是Indexeddb的副本:在打开请求后返回值。成功时
getAllNotes()启动的操作是异步的(它们将在后台运行,需要一段时间才能完成),而最后的console.log()调用是同步运行的,紧跟在getAllNotes()之后。在运行时,这些操作还没有完成,因此没有什么要记录的。
如果您搜索SO中的“indexeddb asynchronous”,您会找到很多关于这个主题的问题和答案。

相关问题