2016-10-19 1 views
0

Wir stehen vor einem Problem.
Wenn wir versuchen, indizierte Datenbank zu öffnen, wird keiner der Callbacks ausgelöst.
Wir nehmen die folgenden Schritte tun:
1.open die Datenbank mit mit folgenden Schritten:
Indizierte db open triggert keinen Callback

request = indexedDB.open(name, 10); 
request.onerror = onError; 
request.onsuccess = onSuccess; 
request.onupgradeneeded = onUpgradeNeeded; 
request.onblocked=onBlocked;<br> 

2.Notice, dass keiner der Callback ausgelöst wird.
3.open chrome: // indexeddb-internals/# und es zeigt vorherigen löschen db ist ausstehend.

Antwort

1

Sie haben wahrscheinlich eine andere Registerkarte geöffnet, die eine Verbindung zur Datenbank hat.

Anforderungen zum Öffnen/Löschen werden in eine Warteschlange eingereiht. Eine offene Anforderung, die keine Version angibt (oder die dieselbe Version wie die aktuelle Datenbank angibt) kann sofort verarbeitet werden, wenn sie an den Anfang der Warteschlange gelangt. Eine offene Anforderung für eine höhere Version oder eine Löschanforderung, die an den Anfang der Warteschlange gelangt, muss auf das Schließen aller anderen Verbindungen warten. Wenn sie unmittelbar nach Erhalt von "Versionsänderung" geschlossen werden, wird die Anfrage fortgesetzt. Wenn nicht, erhält die Anforderung ein "blockiertes" Ereignis und wartet, bis die Verbindungen geschlossen werden.

Beachten Sie, dass andere Anforderungen in der Warteschlange nicht bekommen, Ereignisse - sie warten nur, bis sie an die Spitze der Warteschlange erhalten und entweder verarbeitet bekommen oder „blockiert“

In Schritt 3 Sie berichten, dass es eine vorherige Löschanforderung anstehend Das zeigt an, dass es auf etwas blockiert ist; Vermutlich gibt es noch eine andere Verbindung. Daher befindet sich die Löschanforderung an der Vorderseite der Warteschlange und ist "blockiert". Ihre offene Anforderung (für Version 10) befindet sich dahinter in der Warteschlange und (wie Sie bemerken) wird die Anforderung erst angezeigt, wenn sie es erreicht hat die Vorderseite der Warteschlange.

+0

Gibt es eine Möglichkeit, indizierte db zu löschen, ohne zu löschen, um solche Aktivitäten zu vermeiden? –

+0

Während des Upgrades können Sie alle Objektspeicher auflisten und löschen. (Aber natürlich würde ein Upgrade auch durch offene Verbindungen blockiert werden.) –

+0

Ich schlage vor, andere Antworten zu Rate zu ziehen, um zu erfahren, wie Verbindungen das "versionchange" -Ereignis beobachten und angemessen reagieren, z. http://stackoverflow.com/questions/40032008/how-should-an-app-react-when-indexeddb-is-blocked –

Verwandte Themen