Signatur
Beschreibung
Die schreibgeschützte Eigenschaft closed eines WritableStreamDefaultWriter gibt ein Promise<undefined> zurück, das den Lebenszyklus des zugrunde liegenden WritableStream abbildet. Es wird erfüllt, sobald der Stream vollständig geschlossen ist, d. h. nachdem alle ausstehenden Schreibvorgänge abgearbeitet wurden und die close()-Methode der Senke (Sink) abgeschlossen ist.
Abgelehnt wird das Promise in drei Fällen:
- der Stream gerät in einen Fehlerzustand, z. B. weil
write()oderclose()der Senke eine Ausnahme wirft oder der Controllercontroller.error()aufruft, - der Stream wird mit
writer.abort(reason)abgebrochen – dann ist der Ablehnungsgrundreason, - der Writer gibt seine Sperre mit
writer.releaseLock()frei – dann wird mit einemTypeErrorabgelehnt.
closed eignet sich ideal, um zentral auf das Ende eines Schreibvorgangs zu reagieren – etwa um Aufräumarbeiten auszuführen, einen Fortschrittsbalken abzuschließen oder Fehler an einer einzigen Stelle zu protokollieren, statt jeden write()-Aufruf einzeln zu überwachen. Die Eigenschaft liefert bei jedem Zugriff dasselbe Promise-Objekt für diesen Writer.
Rückgabewert
undefined erfüllt wird, wenn der Stream geschlossen ist, oder mit dem gespeicherten Fehler bzw. einem TypeError (bei releaseLock()) abgelehnt wird.Beispiele
Auf das reguläre Schließen des Streams reagieren
const stream = new WritableStream({
write(chunk) {
console.log('Empfangen:', chunk);
}
});
const writer = stream.getWriter();
// Zentrale Reaktion auf das Ende des Streams
writer.closed.then(() => console.log('Stream geschlossen'));
await writer.write('Hallo');
await writer.write('Welt');
await writer.close();
Fehler der Senke über closed abfangen
const stream = new WritableStream({
write(chunk) {
if (chunk.length > 5) {
throw new Error('Chunk zu groß');
}
}
});
const writer = stream.getWriter();
writer.closed
.then(() => console.log('Fertig'))
.catch(err => console.log('Stream fehlgeschlagen:', err.message));
try {
await writer.write('ok');
await writer.write('viel zu lang');
} catch {
// Einzelfehler hier ignorieren – Protokollierung erfolgt über closed
}
Upload mit abort() abbrechen
const stream = new WritableStream({
async write(chunk) {
await new Promise(r => setTimeout(r, 100)); // simulierter Upload
}
});
const writer = stream.getWriter();
writer.closed.catch(reason => console.log('Abgebrochen:', reason.message));
writer.write(new Uint8Array(1024));
await writer.abort(new Error('Nutzer hat abgebrochen'));
releaseLock() lehnt closed mit TypeError ab
const stream = new WritableStream();
const writer = stream.getWriter();
writer.closed.catch(err => {
console.log(err instanceof TypeError); // Sperre wurde freigegeben
});
writer.releaseLock();
// Ein neuer Writer erhält ein neues closed-Promise
const writer2 = stream.getWriter();
writer2.closed.then(() => console.log('Writer 2: geschlossen'));
await writer2.close();
// Wichtig · Fallstricke
- Nicht mit
close()verwechseln:closedist eine Eigenschaft (Promise),close()eine Methode, die das Schließen erst anstößt. Beide Promises werden bei Erfolg erfüllt;closedspiegelt jedoch zusätzlich Fehler und Abbrüche aus beliebiger Quelle wider. releaseLock()gilt als Ablehnung: Wer nur temporär schreibt und die Sperre wieder freigibt, sollte imcatchzwischenTypeError(Sperre freigegeben) und echten Stream-Fehlern unterscheiden.- Laut Spezifikation wird das abgelehnte
closed-Promise als „behandelt“ markiert – es löst also keineunhandledrejection-Warnung aus. Fehler bleiben daher unbemerkt, wenn manclosednicht explizit abfragt. - Das Promise ist an den Writer gebunden, nicht an den Stream: Jeder neue Writer aus
getWriter()hat ein eigenesclosed-Promise. - Kompatibilität: Firefox unterstützt
WritableStreamerst ab Version 100; in Node.js ist die API global ab Version 18 verfügbar (vorher überstream/web).