我的问题很简单,但令人难以置信的沮丧,因为我现在已经是第二个星期试图弄清楚这个问题了,几乎要放弃了。我想在执行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变量。我得到的结果是“未定义”。任何帮助都将非常感谢。
1条答案
按热度按时间l7mqbcuq1#
这实际上是Indexeddb的副本:在打开请求后返回值。成功时
getAllNotes()启动的操作是异步的(它们将在后台运行,需要一段时间才能完成),而最后的console.log()调用是同步运行的,紧跟在getAllNotes()之后。在运行时,这些操作还没有完成,因此没有什么要记录的。
如果您搜索SO中的“indexeddb asynchronous”,您会找到很多关于这个主题的问题和答案。