Signatur
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
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-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));
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);
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");