Signatur
Beschreibung
close() beendet eine offene Verbindung zu einer IndexedDB-Datenbank, die du vorher mit indexedDB.open() geöffnet hast. Der Aufruf kehrt sofort zurück. Die Verbindung wird aber erst dann wirklich geschlossen, wenn alle Transaktionen fertig sind, die über diese Verbindung gestartet wurden. Neue Transaktionen kannst du ab dem Aufruf nicht mehr starten: transaction() wirft dann eine InvalidStateError-DOMException.
Wichtig ist das vor allem bei Versionswechseln. Wenn ein anderer Tab die Datenbank mit einer höheren Versionsnummer öffnet, bekommen alle bestehenden Verbindungen das Ereignis versionchange. Solange diese Verbindungen offen bleiben, wird das Upgrade blockiert und im anderen Tab feuert blocked. Die übliche Lösung: Im onversionchange-Handler db.close() aufrufen.
Genauso brauchst du close(), bevor du eine Datenbank mit indexedDB.deleteDatabase() löschst. Solange noch eine Verbindung offen ist, wird das Löschen blockiert. In Tests und kurzlebigen Hilfsfunktionen solltest du Verbindungen ebenfalls bewusst schließen, damit keine Ressourcen offen bleiben.
Anders als bei einer Schließung durch den Browser (z. B. beim Löschen der Speicherdaten durch den Nutzer) feuert bei einem manuellen close() kein close-Ereignis.
Rückgabewert
undefined). Die Methode bietet weder ein Promise noch einen Callback, mit dem du erfährst, wann die Verbindung tatsächlich geschlossen ist.Beispiele
Datenbank öffnen, Daten schreiben, Verbindung schließen
const openDB = (name, version) => new Promise((resolve, reject) => {
const req = indexedDB.open(name, version);
req.onupgradeneeded = () => {
req.result.createObjectStore('notizen', { keyPath: 'id' });
};
req.onsuccess = () => resolve(req.result);
req.onerror = () => reject(req.error);
});
const speichereNotiz = async (notiz) => {
const db = await openDB('app-db', 1);
const tx = db.transaction('notizen', 'readwrite');
tx.objectStore('notizen').put(notiz);
// close() darf direkt folgen: Die laufende Transaktion wird noch abgeschlossen
db.close();
await new Promise((resolve, reject) => {
tx.oncomplete = resolve;
tx.onerror = () => reject(tx.error);
});
console.log('Notiz gespeichert, Verbindung geschlossen');
};
speichereNotiz({ id: 1, text: 'Einkaufen' });
Bei versionchange schließen, damit andere Tabs upgraden können
const req = indexedDB.open('app-db', 1);
req.onsuccess = () => {
const db = req.result;
db.onversionchange = (event) => {
console.log(`Neue Version ${event.newVersion} angefordert – schließe Verbindung`);
db.close();
// Optional: Nutzer bitten, die Seite neu zu laden
};
};
Nach close() sind keine neuen Transaktionen möglich
const req = indexedDB.open('app-db', 1);
req.onupgradeneeded = () => req.result.createObjectStore('notizen', { keyPath: 'id' });
req.onsuccess = () => {
const db = req.result;
db.close();
try {
db.transaction('notizen', 'readonly');
} catch (err) {
console.log(err.name);
}
};
Verbindung vor dem Löschen der Datenbank schließen
const loescheDatenbank = (db) => new Promise((resolve, reject) => {
db.close(); // sonst wird deleteDatabase blockiert
const req = indexedDB.deleteDatabase(db.name);
req.onsuccess = () => resolve('gelöscht');
req.onerror = () => reject(req.error);
req.onblocked = () => console.warn('Noch offene Verbindungen in anderen Tabs');
});
const req = indexedDB.open('temp-db', 1);
req.onsuccess = async () => {
console.log(await loescheDatenbank(req.result));
};
// Wichtig · Fallstricke
- Asynchrone Schließung:
close()kehrt sofort zurück. Die Verbindung ist aber erst zu, wenn alle laufenden Transaktionen fertig sind. Ob das geklappt hat, erfährst du nicht direkt: Es gibt weder ein Promise noch ein Ereignis dafür. - Kein
close-Ereignis: Das Ereignisclosefeuert nur, wenn die Verbindung unerwartet geschlossen wird (z. B. weil Speicherdaten gelöscht wurden), nicht bei einem manuellenclose(). - InvalidStateError: Nach dem Aufruf wirft
db.transaction()eineInvalidStateError. Verbindungen, die schon geschlossen sind, lassen sich nicht wieder öffnen. Dafür brauchst du einen neuenindexedDB.open()-Aufruf. - Blockierte Upgrades: Wenn du
versionchangenicht behandelst, bleiben Versions-Upgrades in anderen Tabs hängen (blocked-Ereignis). Reagiere darauf in jeder Anwendung mitdb.close(). - Einen Fehler wirft
close()nicht, auch nicht bei wiederholtem Aufruf. - Kompatibilität: Die Methode wird von allen modernen Browsern unterstützt und ist auch in Web Workern verfügbar.