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



我的问题很简单,但令人难以置信的沮丧,因为我现在在我的第二个星期试图找出这个问题,并在放弃的边缘。我想在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变量。我得到的结果是"未定义"。如有任何帮助,我将不胜感激。

这实际上是Indexeddb的副本:openrequest.onsuccess后的返回值

getAllNotes()启动的操作是异步的(它们将在后台运行并需要时间来完成),而最终的console.log()调用是同步运行的,紧跟在getAllNotes()之后。在运行的时候,操作还没有完成,所以没有什么要记录的。

如果你搜索"indexeddb异步"你会发现很多关于这个话题的问题和答案。

最新更新