Start · Sprachen · JavaScript · Referenz · ReadableStreamBYOBReader.closed

ReadableStreamBYOBReader.closed

Eigenschaft

Gibt ein <code>Promise&lt;undefined&gt;</code> zurück, das erfüllt wird, wenn der Byte-Stream geschlossen wird, und abgelehnt wird, wenn der Stream fehlschlägt oder die Sperre freigegeben wird.

seit JavaScript Chrome/Edge 89+, Firefox 102+, Safari erst in neue Kategorie: webapi

Signatur

get ReadableStreamBYOBReader.closed

Beschreibung

Die schreibgeschützte Eigenschaft closed eines ReadableStreamBYOBReader liefert ein Promise<undefined>, das zeigt, in welchem Zustand der zugrunde liegende Byte-Stream endet. Das Promise wird erfüllt, wenn der Stream regulär geschlossen wird (durch controller.close(), nachdem alle Bytes aus der Warteschlange gelesen wurden, oder durch reader.cancel()). Abgelehnt wird es, wenn der Stream in einen Fehlerzustand übergeht (controller.error()) oder wenn die Sperre des Readers mit releaseLock() freigegeben wird.

Einen BYOB-Reader („Bring Your Own Buffer“) gibt es nur für Byte-Streams, also für new ReadableStream({ type: "bytes", … }). Du erzeugst ihn mit stream.getReader({ mode: "byob" }). Mit closed kannst du auf das Ende des Streams reagieren, ohne das in der Leseschleife selbst zu erledigen. Das eignet sich zum Aufräumen von Ressourcen, zum Aktualisieren der Oberfläche oder um Fehler an einer zentralen Stelle zu protokollieren.

Solange der Reader die Sperre hält, liefert jeder Zugriff auf closed dasselbe Promise-Objekt. Du kannst also an mehreren Stellen mit then(), catch() oder await darauf warten. Die Eigenschaft hat nur einen Getter und nimmt keine Parameter entgegen.

Rückgabewert

Typ
Promise<undefined>
Beschreibung
Ein Promise, das mit undefined erfüllt wird, wenn der Stream geschlossen ist. Es wird mit dem Fehlergrund des Streams abgelehnt, wenn der Stream fehlschlägt, oder mit einem TypeError, wenn die Sperre des Readers freigegeben wird.

Beispiele

Ende eines Byte-Streams unabhängig von der Leseschleife erkennen

const main = async () => {
  const stream = new ReadableStream({
    type: "bytes",
    start(controller) {
      controller.enqueue(new Uint8Array([1, 2, 3, 4, 5]));
      controller.close();
    }
  });

  const reader = stream.getReader({ mode: "byob" });
  reader.closed.then(() => console.log("Stream geschlossen"));

  let buffer = new ArrayBuffer(4);
  let total = 0;
  while (true) {
    const { value, done } = await reader.read(new Uint8Array(buffer));
    if (done) break;
    total += value.byteLength;
    buffer = value.buffer; // übertragenen Puffer wiederverwenden
  }
  console.log(`Gelesen: ${total} Bytes`);
};

main();
Stream geschlossen Gelesen: 5 Bytes

Stream-Fehler zentral protokollieren

const stream = new ReadableStream({
  type: "bytes",
  start(controller) {
    // simuliert einen Abbruch der Datenquelle
    setTimeout(() => controller.error(new Error("Verbindung abgebrochen")), 100);
  }
});

const reader = stream.getReader({ mode: "byob" });

reader.closed
  .then(() => console.log("Regulär beendet"))
  .catch((err) => console.error("Stream-Fehler:", err.message));
Stream-Fehler: Verbindung abgebrochen

Ablehnung durch releaseLock() abfangen

const stream = new ReadableStream({ type: "bytes" });
const reader = stream.getReader({ mode: "byob" });

// Ohne catch gäbe es hier eine unbehandelte Promise-Ablehnung
reader.closed.catch((err) => console.log("closed abgelehnt:", err.name));

reader.releaseLock();
console.log("Gesperrt:", stream.locked);
Gesperrt: false closed abgelehnt: TypeError

Aufräumen mit finally nach cancel()

const stream = new ReadableStream({
  type: "bytes",
  cancel(reason) {
    console.log("Quelle abgebrochen:", reason);
  }
});

const reader = stream.getReader({ mode: "byob" });

reader.closed
  .finally(() => console.log("Ressourcen freigegeben"));

await reader.cancel("Nutzer hat abgebrochen");
Quelle abgebrochen: Nutzer hat abgebrochen Ressourcen freigegeben