Ich sehe, dass manchmal keine der Ereignisse ausgelöst werden, wenn indexedDb.open() tun. Wenn ich eine Zeitüberschreitung einstelle und den Status von openRequest beobachte, wird der Bereitschaftszustand = 'done' gesetzt. Wenn ich eine Transaktion auf der db im openRequest.result mache, funktioniert es gut.indexedDb keine Ereignisse feuern auf Open
Meine Vermutung ist, dass in einigen Fällen die Ausführung von openRequest abgeschlossen ist, bevor wir 'onsuccess' oder andere Event-Handler anhängen, mit anderen Worten, es wird nicht in der nächsten Event-Schleife ausgeführt.
So kann ich den Zustand nach einer "x" Zeit prüfen, wenn kein Ereignis ausgelöst wird. Dieser Ansatz ist jedoch hackisch und zerbrechlich. Kennt jemand eine bessere Möglichkeit, dies zu beheben?
var db;
var openRequest = window.indexedDB.open("todos", 1);
openRequest.onerror = function(event) {
console.error('error in open', event);
};
openRequest.onsuccess = (event) => {
console.log('success ' , event)
};
openRequest.onupgradeneeded = (event) => {
console.log('upgradeneeded ' , event);
db = event.target.result;
db.createObjectStore("toDoList", { keyPath: "taskTitle" });
};
openRequest.onblocked = (event) => {
console.log('blocked ' , event);
};
setTimeout(() => {
console.log('timeout');
console.log(openRequest.readyState) // equals done
}, 10000)
Warum verwenden Sie eine globale db-Variable? Und wieso weisen Sie db nur einen Wert innerhalb der onupgradeeneeded-Funktion zu? – Josh
Dieser Code ist nur mit Protokollanweisungen vereinfacht. db wird auch vom Erfolgs-Handler gesetzt. – sbr