Signatur
Beschreibung
Mit abort() teilt der Produzent mit, dass er nicht mehr erfolgreich in den Stream schreiben kann oder will. Der Stream geht sofort in den Fehlerzustand über. Alle noch in der Warteschlange stehenden Chunks werden verworfen, und die zugehörigen write()-Promises werden mit dem angegebenen Grund zurückgewiesen. Danach wird die abort(reason)-Methode der zugrunde liegenden Senke (Underlying Sink) aufgerufen. Dort lassen sich Ressourcen freigeben, zum Beispiel eine Datei-Handle schließen oder einen Upload abbrechen.
Anders als close() wartet abort() nicht, bis alle Daten geschrieben sind. Ein Schreibvorgang, der gerade läuft, wird zwar noch abgewartet. Über controller.signal (ein AbortSignal im WritableStreamDefaultController) kann die Senke aber sofort auf den Abbruch reagieren und auch diesen Vorgang beenden.
Die Methode lässt sich nur auf einem nicht gesperrten Stream aufrufen. Hat man bereits mit getWriter() einen Writer geholt, verwendet man stattdessen WritableStreamDefaultWriter.abort(). Diese Methode tut dasselbe, geht aber über den Writer.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $reason | any | undefined | Grund für den Abbruch, meist ein Error oder ein String. Er wird an abort(reason) der Senke und an controller.signal.reason übergeben. Außerdem werden damit wartende Schreib-Promises und writer.closed zurückgewiesen. |
Rückgabewert
undefined erfüllt wird, sobald die Senke den Abbruch verarbeitet hat. Es wird zurückgewiesen, wenn die abort()-Methode der Senke fehlschlägt. Ist der Stream gesperrt, wird es mit einem TypeError zurückgewiesen. Ist der Stream bereits geschlossen oder im Fehlerzustand, wird es sofort erfüllt.Beispiele
Einfacher Abbruch mit Aufräumen in der Senke
const stream = new WritableStream({
write(chunk) {
console.log('Schreibe:', chunk);
},
abort(reason) {
// Ressourcen freigeben, z. B. temporäre Datei löschen
console.log('Senke abgebrochen:', reason);
}
});
await stream.abort('Benutzer hat abgebrochen');
console.log('Stream ist im Fehlerzustand');
Gesperrter Stream: TypeError vs. writer.abort()
const stream = new WritableStream({
abort(reason) {
console.log('abort:', reason.message);
}
});
const writer = stream.getWriter(); // Stream ist jetzt gesperrt
try {
await stream.abort(new Error('geht nicht'));
} catch (err) {
console.log('Fehler:', err.name);
}
// Richtig: über den Writer abbrechen
await writer.abort(new Error('Upload abgebrochen'));
try {
await writer.closed;
} catch (err) {
console.log('closed abgelehnt:', err.message);
}
Laufenden Schreibvorgang über controller.signal beenden
const stream = new WritableStream({
write(chunk, controller) {
return new Promise((resolve, reject) => {
// Simuliert einen langsamen Schreibvorgang (z. B. Netzwerk)
const timer = setTimeout(() => {
console.log('Geschrieben:', chunk);
resolve();
}, 1000);
controller.signal.addEventListener('abort', () => {
clearTimeout(timer);
reject(controller.signal.reason);
});
});
},
abort(reason) {
console.log('Senke aufgeräumt:', reason);
}
});
const writer = stream.getWriter();
writer.write('Block 1').catch((e) => console.log('Block 1 fehlgeschlagen:', e));
writer.write('Block 2').catch((e) => console.log('Block 2 verworfen:', e));
// Nach 300 ms abbrechen (z. B. Zeitüberschreitung)
setTimeout(() => writer.abort('Timeout'), 300);