Start · Sprachen · JavaScript · Referenz · IDBRequest.readyState

IDBRequest.readyState

Eigenschaft

Schreibgeschützte Eigenschaft, die den Status einer IndexedDB-Anfrage liefert: <code>"pending"</code> (läuft noch) oder <code>"done"</code> (abgeschlossen).

seit JavaScript Baseline: alle Browser (IndexedDB 2.0) Kategorie: webapi

Signatur

IDBRequest.readyState

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

Typ
"pending" | "done"
Beschreibung
Die Zeichenkette "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);
  };
};
Direkt nach put(): pending Im success-Handler: done – Schlüssel: 1

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();
{ id: 1, name: 'Tastatur' }

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);
Anfrage läuft noch – result ist noch nicht verfügbar. undefined true

// Wichtig · Fallstricke

  • Kein Fehlerindikator: "done" sagt nichts über Erfolg oder Misserfolg aus. Ob die Anfrage geklappt hat, zeigt erst request.error: Bei Erfolg ist der Wert null, sonst eine DOMException.
  • InvalidStateError: Wer auf result oder error zugreift, solange readyState === "pending" gilt, bekommt eine Ausnahme.
  • Kein readystatechange-Ereignis: Anders als bei XMLHttpRequest oder document gibt es kein Ereignis für Zustandswechsel. Man reagiert stattdessen auf success und error bzw. bei IDBOpenDBRequest zusätzlich auf upgradeneeded und blocked.
  • Schreibgeschützt: Eine Zuweisung wird still ignoriert, im Strict Mode löst sie einen TypeError aus.
  • 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.