Signatur
Beschreibung
Die Eigenschaft readyState eines IDBRequest-Objekts gibt an, in welchem Zustand eine asynchrone IndexedDB-Anfrage gerade ist. Es gibt genau zwei mögliche Werte: "pending" heißt, dass die Anfrage noch läuft. "done" heißt, dass sie abgeschlossen ist, egal ob erfolgreich oder mit Fehler.
Jede Anfrage beginnt im Zustand "pending". Bevor das success- oder error-Ereignis ausgelöst wird, wechselt der Zustand auf "done". Erst ab diesem Zeitpunkt darf man auf request.result oder request.error zugreifen. Solange die Anfrage noch "pending" ist, lösen beide Eigenschaften eine InvalidStateError-DOMException aus.
In der Praxis braucht man readyState vor allem zur Fehlersuche, für Schutzabfragen in Hilfsfunktionen und beim Umwandeln von IDBRequest in ein Promise. Dort lässt sich damit prüfen, ob eine Anfrage schon fertig war, bevor die Ereignis-Listener registriert wurden. IDBOpenDBRequest erbt die Eigenschaft ebenfalls. Sie gilt also auch für indexedDB.open().
Rückgabewert
"pending", solange die Anfrage läuft, und "done", sobald sie abgeschlossen ist (erfolgreich oder fehlgeschlagen).Beispiele
Zustand vor und nach dem success-Ereignis
const openReq = indexedDB.open('shop', 1);
openReq.onupgradeneeded = () => {
openReq.result.createObjectStore('produkte', { keyPath: 'id' });
};
openReq.onsuccess = () => {
const db = openReq.result;
const store = db.transaction('produkte', 'readwrite').objectStore('produkte');
const req = store.put({ id: 1, name: 'Tastatur' });
console.log('Direkt nach put():', req.readyState);
req.onsuccess = () => {
console.log('Im success-Handler:', req.readyState, '– Schlüssel:', req.result);
};
};
IDBRequest robust in ein Promise umwandeln
const requestToPromise = (req) => {
// Anfrage schon abgeschlossen? Dann sofort auflösen.
if (req.readyState === 'done') {
return req.error ? Promise.reject(req.error) : Promise.resolve(req.result);
}
return new Promise((resolve, reject) => {
req.addEventListener('success', () => resolve(req.result), { once: true });
req.addEventListener('error', () => reject(req.error), { once: true });
});
};
const main = async () => {
const db = await requestToPromise(indexedDB.open('shop', 1));
const store = db.transaction('produkte').objectStore('produkte');
const produkt = await requestToPromise(store.get(1));
console.log(produkt);
};
main();
Vorzeitigen Zugriff auf result verhindern
const safeResult = (req) => {
if (req.readyState !== 'done') {
console.warn('Anfrage läuft noch – result ist noch nicht verfügbar.');
return undefined;
}
return req.result;
};
const req = indexedDB.open('shop', 1);
console.log(safeResult(req));
req.onsuccess = () => console.log(safeResult(req) instanceof IDBDatabase);
// Wichtig · Fallstricke
- Kein Fehlerindikator:
"done"sagt nichts über Erfolg oder Misserfolg aus. Ob die Anfrage geklappt hat, zeigt erstrequest.error: Bei Erfolg ist der Wertnull, sonst eineDOMException. - InvalidStateError: Wer auf
resultodererrorzugreift, solangereadyState === "pending"gilt, bekommt eine Ausnahme. - Kein readystatechange-Ereignis: Anders als bei
XMLHttpRequestoderdocumentgibt es kein Ereignis für Zustandswechsel. Man reagiert stattdessen aufsuccessunderrorbzw. beiIDBOpenDBRequestzusätzlich aufupgradeneededundblocked. - Schreibgeschützt: Eine Zuweisung wird still ignoriert, im Strict Mode löst sie einen
TypeErroraus. - Kompatibilität: Wird von allen modernen Browsern unterstützt, auch in Web Workern. Im privaten Modus älterer Firefox-Versionen stand IndexedDB teilweise nicht zur Verfügung.