0

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) 
+0

Warum verwenden Sie eine globale db-Variable? Und wieso weisen Sie db nur einen Wert innerhalb der onupgradeeneeded-Funktion zu? – Josh

+0

Dieser Code ist nur mit Protokollanweisungen vereinfacht. db wird auch vom Erfolgs-Handler gesetzt. – sbr

Antwort

1

Entweder ein "success" oder ein "error" Ereignis muss ausgelöst, wenn readyState"done" wird. Wenn das nicht passiert, haben Sie einen Browser-Fehler gefunden.

Wie in einem Kommentar erwähnt, möchten Sie db = event.target.result in der onsuccess Handler ebenso, sonst db wird nicht festgelegt, wenn ein Upgrade nicht erforderlich war. Sind Sie sicher, dass dies nicht die Ursache Ihres Fehlers ist? (Dh vielleicht successwurde Brennen Sie waren einfach nicht das Ergebnis erfassen?)

in einigen Fällen die Openrequest Ausführung abgeschlossen ist, bevor wir befestigen bekommen ‚onsuccess‘ oder andere Event-Handler

Wenn das passiert wäre es ein Browser Bug. Siehst du ein konsistentes Verhalten in allen Browsern? Kannst du das zuverlässig reproduzieren?

+0

Ich sehe dieses Verhalten auf dem Gebiet, auf Chrome, Edge, Safari und Firefox. habe leider keinen repro-schritt. – sbr

+0

Das Verhalten, das Sie sehen, wird nicht erwartet. Es ist wahrscheinlich, dass ein Fehler in Ihrem Code ist; Ohne Ihren eigentlichen Code zu sehen, wird es schwierig sein, weitere Vorschläge zu machen. –

Verwandte Themen