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

WritableStreamDefaultWriter.abort()

Methode

Bricht den zugehörigen <code>WritableStream</code> sofort ab, verwirft wartende Schreibvorgänge und versetzt den Stream in einen Fehlerzustand.

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

Signatur

WritableStreamDefaultWriter.prototype.abort(reason)

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

Typ
Promise<undefined>
Beschreibung
Ein Promise, das mit 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();
Schreibe: Teil 1 Senke abgebrochen: Nutzer hat abgebrochen Abbruch abgeschlossen

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();
closed abgelehnt: Verbindung verloren write abgelehnt: Verbindung verloren

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);
Aufräumen, Grund: Abgebrochen | geschrieben: 3 Erzeuger gestoppt: Abgebrochen

// 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() liefert abort() ein abgelehntes Promise (TypeError). Ohne Writer kann WritableStream.prototype.abort() direkt genutzt werden – das schlägt jedoch fehl, solange der Stream gesperrt ist.
  • Den Rückgabe-Promise sowie writer.closed mit catch behandeln, 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.