Signatur
Beschreibung
Die schreibgeschützte Eigenschaft readyState eines FileReader-Objekts zeigt, in welcher Phase sich der Lesevorgang befindet. Der Wert ist immer eine der drei Konstanten, die auf dem Interface selbst definiert sind:
FileReader.EMPTY(0): Es wurden noch keine Daten geladen. Das ist der Ausgangszustand, bevor eine Lesemethode aufgerufen wurde.FileReader.LOADING(1): Die Daten werden gerade gelesen, zum Beispiel nachreadAsText()oderreadAsArrayBuffer().FileReader.DONE(2): Der Lesevorgang ist beendet: erfolgreich, mit Fehler oder durchabort()abgebrochen.
Die Eigenschaft ist vor allem nützlich, um Mehrfachaufrufe abzufangen. Ruft man eine readAs*()-Methode auf, während readyState auf LOADING steht, wird eine InvalidStateError-DOMException geworfen. Außerdem hilft sie bei der Fehlersuche und bei der Entscheidung, ob abort() überhaupt nötig ist.
Für die eigentliche Ablaufsteuerung sind die Events load, error, abort und loadend meist die bessere Wahl. readyState ergänzt sie als synchron abfragbarer Zustand. Ob ein Lesevorgang erfolgreich war, verrät DONE allein nicht. Dafür prüft man zusätzlich reader.error bzw. reader.result.
Rückgabewert
0 (FileReader.EMPTY), 1 (FileReader.LOADING) oder 2 (FileReader.DONE).Beispiele
Zustände während des Lesens protokollieren
const blob = new Blob(['Hallo Welt'], { type: 'text/plain' });
const reader = new FileReader();
console.log('vorher:', reader.readyState);
reader.addEventListener('loadend', () => {
console.log('loadend:', reader.readyState, reader.result);
});
reader.readAsText(blob);
console.log('nach readAsText:', reader.readyState);
Doppelten Lesevorgang verhindern (InvalidStateError)
const reader = new FileReader();
const input = document.querySelector('input[type="file"]');
input.addEventListener('change', () => {
const file = input.files[0];
if (!file) return;
// Laufenden Vorgang abbrechen, statt einen InvalidStateError zu riskieren
if (reader.readyState === FileReader.LOADING) {
reader.abort();
}
reader.readAsDataURL(file);
});
reader.onload = () => {
document.querySelector('img').src = reader.result;
};
Promise-Wrapper mit Zustandsprüfung
const readFileAsText = (file) => new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onloadend = () => {
// DONE heißt nur „fertig“ – Erfolg separat prüfen
if (reader.readyState === FileReader.DONE && !reader.error) {
resolve(reader.result);
} else {
reject(reader.error ?? new Error('Lesevorgang abgebrochen'));
}
};
reader.readAsText(file);
});
const text = await readFileAsText(new Blob(['CSV;Daten']));
console.log(text);
// Wichtig · Fallstricke
- DONE bedeutet nicht Erfolg: Auch nach einem Fehler oder
abort()stehtreadyStateauf2. Prüfe zusätzlichreader.error. - Ruft man eine
readAs*()-Methode auf, während der ZustandLOADINGist, wird einInvalidStateErrorgeworfen. Wiederholte Lesevorgänge brauchen deshalb einen neuenFileReaderoder vorherabort(). - Ein
FileReaderim ZustandDONElässt sich für einen neuen Lesevorgang wiederverwenden. - Die Eigenschaft ist schreibgeschützt. Zuweisungen werden stillschweigend ignoriert, im Strict Mode werfen sie einen
TypeError. - Vergleiche besser mit den Konstanten
FileReader.EMPTY,LOADINGundDONEals mit den nackten Zahlen, das ist lesbarer. - Für neuen Code sind oft
Blob.prototype.text()undarrayBuffer()einfacher, weil sie direkt ein Promise liefern. - Kompatibilität: Wird von allen modernen Browsern und in Web Workern unterstützt. Node.js hat keinen
FileReader, dort nutzt manBlob-Methoden oderfs.