Start · Sprachen · JavaScript · Referenz · WritableStreamDefaultWriter.closed

WritableStreamDefaultWriter.closed

Eigenschaft

Liefert ein <code>Promise</code>, das erfüllt wird, sobald der Stream geschlossen ist, und abgelehnt wird, wenn der Stream fehlschlägt oder die Sperre des Writers aufgehoben wird.

seit JavaScript Baseline: weitgehend verfügbar (Chrome 59+, Firefo Kategorie: webapi

Signatur

get WritableStreamDefaultWriter.closed

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() oder close() der Senke eine Ausnahme wirft oder der Controller controller.error() aufruft,
  • der Stream wird mit writer.abort(reason) abgebrochen – dann ist der Ablehnungsgrund reason,
  • der Writer gibt seine Sperre mit writer.releaseLock() frei – dann wird mit einem TypeError abgelehnt.

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

Typ
Promise<undefined>
Beschreibung
Ein Promise, das mit 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();
Empfangen: Hallo Empfangen: Welt Stream geschlossen

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
}
Stream fehlgeschlagen: Chunk zu groß

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'));
Abgebrochen: 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();
true Writer 2: geschlossen

// Wichtig · Fallstricke

  • Nicht mit close() verwechseln: closed ist eine Eigenschaft (Promise), close() eine Methode, die das Schließen erst anstößt. Beide Promises werden bei Erfolg erfüllt; closed spiegelt 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 im catch zwischen TypeError (Sperre freigegeben) und echten Stream-Fehlern unterscheiden.
  • Laut Spezifikation wird das abgelehnte closed-Promise als „behandelt“ markiert – es löst also keine unhandledrejection-Warnung aus. Fehler bleiben daher unbemerkt, wenn man closed nicht explizit abfragt.
  • Das Promise ist an den Writer gebunden, nicht an den Stream: Jeder neue Writer aus getWriter() hat ein eigenes closed-Promise.
  • Kompatibilität: Firefox unterstützt WritableStream erst ab Version 100; in Node.js ist die API global ab Version 18 verfügbar (vorher über stream/web).