Start · Sprachen · JavaScript · Referenz · WritableStream.abort()

WritableStream.abort()

Methode

Bricht einen <code>WritableStream</code> sofort ab, verwirft noch wartende Schreibvorgänge und versetzt den Stream mit einem optionalen Grund in den Fehlerzustand.

seit JavaScript Baseline: alle modernen Browser (seit 2022), Node. Kategorie: webapi

Signatur

WritableStream.prototype.abort(reason)

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

Typ
Promise<undefined>
Beschreibung
Ein Promise, das mit 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');
Senke abgebrochen: Benutzer hat abgebrochen 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);
}
Fehler: TypeError abort: Upload abgebrochen closed abgelehnt: Upload abgebrochen

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);
Block 1 fehlgeschlagen: Timeout Block 2 verworfen: Timeout Senke aufgeräumt: Timeout