Signatur
Beschreibung
Mit abort() teilt der Erzeuger mit, dass er nicht mehr sinnvoll in den Stream schreiben kann oder will – etwa weil der Nutzer einen Upload abbricht oder ein Fehler aufgetreten ist. Der Stream geht sofort in den Fehlerzustand über. Alle noch in der Warteschlange befindlichen Chunks werden verworfen, nicht mehr geschrieben.
Intern wird die abort(reason)-Methode der zugrunde liegenden Senke (underlying sink) aufgerufen, sofern sie definiert ist. Dort kann man Ressourcen freigeben, z. B. eine Datei schließen oder eine Netzwerkverbindung beenden. Der übergebene Grund wird an diese Methode weitergereicht und steht anschließend auch als Ablehnungsgrund von writer.closed sowie von späteren write()-Aufrufen zur Verfügung.
Im Unterschied zu close() wartet abort() nicht darauf, dass bereits eingereihte Daten verarbeitet werden. Verwenden Sie close() für ein reguläres Ende, abort() für einen Abbruch. Ist der Writer bereits freigegeben (releaseLock()), wird das zurückgegebene Promise mit einem TypeError abgelehnt.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $reason | any | undefined | Beliebiger Wert (typischerweise ein Error oder String), der den Abbruchgrund beschreibt. Wird an sink.abort() übergeben und dient als Ablehnungsgrund für writer.closed. |
Rückgabewert
undefined erfüllt wird, sobald die Senke den Abbruch verarbeitet hat. Es wird abgelehnt, wenn sink.abort() einen Fehler wirft oder der Writer nicht mehr gesperrt ist (TypeError).Beispiele
Einfacher Abbruch mit Aufräumlogik in der Senke
const stream = new WritableStream({
write(chunk) {
console.log('Schreibe:', chunk);
},
abort(reason) {
console.log('Senke abgebrochen:', reason);
}
});
const writer = stream.getWriter();
const run = async () => {
await writer.write('Teil 1');
await writer.abort('Nutzer hat abgebrochen');
console.log('Abbruch abgeschlossen');
};
run();
Folgen des Abbruchs: closed und write() werden abgelehnt
const writer = new WritableStream().getWriter();
writer.closed.catch((err) => console.log('closed abgelehnt:', err.message));
const run = async () => {
await writer.abort(new Error('Verbindung verloren'));
try {
await writer.write('zu spät');
} catch (err) {
console.log('write abgelehnt:', err.message);
}
};
run();
Abbruch-Button für einen laufenden Schreibvorgang
const log = [];
const stream = new WritableStream({
async write(chunk) {
await new Promise((r) => setTimeout(r, 100)); // langsame Senke simulieren
log.push(chunk);
},
abort(reason) {
console.log('Aufräumen, Grund:', reason.message, '| geschrieben:', log.length);
}
});
const writer = stream.getWriter();
const produce = async () => {
try {
for (let i = 0; i < 100; i++) {
await writer.ready;
await writer.write(`Chunk ${i}`);
}
await writer.close();
} catch (err) {
console.log('Erzeuger gestoppt:', err.message);
}
};
produce();
// z. B. im Click-Handler eines Abbrechen-Buttons
setTimeout(() => writer.abort(new Error('Abgebrochen')), 350);
// Wichtig · Fallstricke
- Datenverlust: Bereits eingereihte, aber noch nicht verarbeitete Chunks werden verworfen. Für ein sauberes Ende
close()verwenden. - Ein bereits laufender
sink.write()-Aufruf wird nicht unterbrochen –sink.abort()wird erst danach aufgerufen. - Ist der Stream bereits geschlossen oder fehlerhaft, wird das Promise einfach erfüllt, ohne dass
sink.abort()erneut aufgerufen wird. - Nach
releaseLock()liefertabort()ein abgelehntes Promise (TypeError). Ohne Writer kannWritableStream.prototype.abort()direkt genutzt werden – das schlägt jedoch fehl, solange der Stream gesperrt ist. - Den Rückgabe-Promise sowie
writer.closedmitcatchbehandeln, sonst drohen unhandled rejections. - Kompatibilität: In allen aktuellen Browsern verfügbar (Firefox erst seit Version 100), in Node.js ab 18 global, davor über
stream/web.