WritableStream: close() Methode

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since May 2022.

Hinweis: Diese Funktion ist in Web Workers verfügbar.

Die close() Methode der WritableStream Schnittstelle schließt den zugehörigen Stream. Alle Chunks, die geschrieben wurden, bevor diese Methode aufgerufen wird, werden gesendet, bevor das zurückgegebene Promise erfüllt wird.

Dies entspricht dem Abrufen eines WritableStreamDefaultWriter mit getWriter() und dem Aufruf von close() darauf.

Syntax

js
close()

Parameter

Keine.

Rückgabewert

Ein Promise, das mit undefined erfüllt wird, wenn alle verbleibenden Chunks erfolgreich geschrieben wurden, bevor der Stream geschlossen wurde, oder das mit einem Fehler abgelehnt wird, wenn während des Vorgangs ein Problem aufgetreten ist.

Ausnahmen

TypeError

Der Stream, den Sie zu schließen versuchen, ist gesperrt.

Beispiele

Das folgende Beispiel veranschaulicht mehrere Funktionen des WritableStream. Es zeigt die Erstellung des WritableStream mit einem benutzerdefinierten Sink und einer vom API bereitgestellten Warteschlangenstrategie. Anschließend wird eine Funktion namens sendMessage() aufgerufen und der neu erstellte Stream sowie ein String übergeben. In dieser Funktion wird die getWriter()-Methode des Streams aufgerufen, die eine Instanz von WritableStreamDefaultWriter zurückgibt. Ein forEach()-Aufruf wird verwendet, um jeden Chunk des Strings in den Stream zu schreiben. Schließlich geben write() und close() Promises zurück, die verarbeitet werden, um mit Erfolg oder Misserfolg von Chunks und Streams umzugehen. Beachten Sie, dass der Writer getrennt werden muss, um close() direkt auf dem Stream aufrufen zu können, indem defaultWriter.releaseLock(); verwendet wird.

js
function sendMessage(message, writableStream) {
  // defaultWriter is of type WritableStreamDefaultWriter
  const defaultWriter = writableStream.getWriter();
  const encoder = new TextEncoder();
  const encoded = encoder.encode(message);
  encoded.forEach((chunk) => {
    defaultWriter.ready
      .then(() => {
        defaultWriter.write(chunk);
      })
      .catch((err) => {
        log("Chunk error:", err);
      });
  });

  // Call ready again to ensure that all chunks are written
  //   before closing the writer.
  defaultWriter.ready
    .then(() => {
      defaultWriter.releaseLock();
      writableStream.close();
    })
    .then(() => {
      log("All chunks written / stream closed.");
    })
    .catch((err) => {
      log("Stream error:", err);
    });
}

const decoder = new TextDecoder("utf-8");
const queuingStrategy = new CountQueuingStrategy({ highWaterMark: 1 });
let result = "";
const writableStream = new WritableStream(
  {
    // Implement the sink
    write(chunk) {
      return new Promise((resolve, reject) => {
        const buffer = new ArrayBuffer(1);
        const view = new Uint8Array(buffer);
        view[0] = chunk;
        const decoded = decoder.decode(view, { stream: true });
        const listItem = document.createElement("li");
        result += decoded;
        resolve();
      });
    },
    close() {
      const listItem = document.createElement("li");
      log(`[MESSAGE RECEIVED] ${result}`);
    },
    abort(err) {
      log("Sink error:", err);
    },
  },
  queuingStrategy,
);

log("Sending 'Hello, world.' message.");
sendMessage("Hello, world.", writableStream);

Spezifikationen

Specification
Streams
# ref-for-ws-close①

Browser-Kompatibilität