Signatur
Beschreibung
Die schreibgeschützte Eigenschaft ready eines WritableStreamDefaultWriter gibt ein Promise<undefined> zurück. Es wird erfüllt, sobald die gewünschte Größe der internen Warteschlange (writer.desiredSize) von null oder negativ auf einen positiven Wert steigt. Das zeigt an, dass der Stream keinen Gegendruck (Backpressure) mehr ausübt und wieder Daten annehmen kann.
Nutze ready in Schreibschleifen, bevor du writer.write() aufrufst: await writer.ready sorgt dafür, dass der Produzent nicht schneller schreibt, als die Senke (z. B. Netzwerk, Datei, Encoder) verarbeiten kann. So wächst der Speicherbedarf nicht unbegrenzt. Ist sofort Platz, ist das Promise schon erfüllt und das await kostet praktisch nichts.
Das Promise kann sich ändern: Entsteht Backpressure, ersetzt der Writer ready durch ein neues, noch ausstehendes Promise. Frag die Eigenschaft deshalb bei jedem Schleifendurchlauf neu ab und speichere sie nicht einmalig in einer Variablen. Gerät der Stream in einen Fehlerzustand oder wird die Sperre des Writers aufgehoben (releaseLock()), wird ready abgelehnt.
Rückgabewert
undefined erfüllt wird, sobald desiredSize positiv ist. Es wird abgelehnt, wenn der Stream fehlerhaft ist, abgebrochen wurde oder der Writer seine Sperre freigibt.Beispiele
Backpressure in einer Schreibschleife beachten
const stream = new WritableStream(
{
write(chunk) {
// Langsame Senke simulieren
return new Promise((resolve) => setTimeout(() => {
console.log('geschrieben:', chunk);
resolve();
}, 100));
}
},
new CountQueuingStrategy({ highWaterMark: 2 })
);
const writer = stream.getWriter();
const produce = async () => {
for (const item of ['a', 'b', 'c', 'd']) {
await writer.ready; // warten, bis wieder Platz ist
writer.write(item).catch(console.error);
}
await writer.ready;
await writer.close();
console.log('fertig');
};
produce();
desiredSize und ready gemeinsam beobachten
const stream = new WritableStream(
{ write: () => new Promise((r) => setTimeout(r, 50)) },
{ highWaterMark: 1 }
);
const writer = stream.getWriter();
console.log('vorher:', writer.desiredSize); // 1
writer.write('x');
console.log('nach write:', writer.desiredSize); // 0 -> Backpressure
await writer.ready;
console.log('wieder bereit:', writer.desiredSize); // 1
Ablehnung bei Fehler oder releaseLock abfangen
const stream = new WritableStream({
write() {
throw new Error('Senke defekt');
}
});
const writer = stream.getWriter();
writer.write('daten').catch(() => {});
try {
await writer.closed; // wird durch den Fehler abgelehnt
} catch (err) {
console.log('Stream-Fehler:', err.message);
}
writer.ready.catch((err) => console.log('ready abgelehnt:', err.message));
// Wichtig · Fallstricke
- Nicht zwischenspeichern:
readykann bei jeder Änderung des Backpressure-Zustands ein neues Promise liefern. Lieswriter.readydeshalb vor jedemwrite()neu aus. await writer.readyist keine Pflicht:write()reiht Daten auch unter Backpressure ein. Werreadyweglässt, riskiert aber eine unbegrenzt wachsende Warteschlange und hohen Speicherverbrauch.- Nach
releaseLock()wirdreadymit einemTypeErrorabgelehnt. Unbehandelte Ablehnungen erzeugen Warnungen vom Typ „unhandled rejection“. - Im Fehlerzustand wird
readymit dem gespeicherten Fehler abgelehnt. Nutze für Fehlerbehandlung und Abschluss zusätzlichwriter.closed. - Kompatibilität: Streams API in Chrome, Edge, Firefox (ab 100) und Safari verfügbar. In Node.js unter
stream/webund ab Version 18 global.