WritableStreamDefaultWriter: close() 方法

Baseline 已廣泛支援

此功能已成熟,並可在許多裝置和瀏覽器版本上使用。自 2022 年 5 月以來,它已在各個瀏覽器中可用。

注意:此功能在 Web Workers 中可用。

close() 方法是 WritableStreamDefaultWriter 介面的一部分,用於關閉關聯的可寫流。

底層接收器(sink)將完成處理任何先前已寫入的資料塊,然後才會呼叫關閉行為。在此期間,任何進一步的寫入嘗試都將失敗(但不會導致流出錯)。

語法

js
close()

引數

無。

返回值

一個 Promise,如果所有剩餘的資料塊在關閉前都已成功寫入,則會以 undefined fulfilled,如果在此過程中遇到任何問題,則會以錯誤 reject。

異常

TypeError

您嘗試關閉的流不是 WritableStream

示例

以下示例展示瞭如何建立一個具有自定義接收器(sink)和 API 提供的排隊策略的 WritableStream。然後,它呼叫一個名為 sendMessage() 的函式,並將新建立的流和一個字串作為引數傳遞。在此函式內部,它呼叫流的 getWriter() 方法,該方法返回一個 WritableStreamDefaultWriter 例項。使用 write() 方法將編碼字串的每個資料塊寫入流,並使用編碼後的 Uint8ArrayforEach() 方法逐位元組處理。最後,呼叫 close() 方法,並處理它返回的 Promise,以應對分塊寫入操作的成功(或任何失敗)。

js
const list = document.querySelector("ul");

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);
      })
      .then(() => {
        console.log("Chunk written to sink.");
      })
      .catch((err) => {
        console.log("Chunk error:", err);
      });
  });
  // Call ready again to ensure that all chunks are written
  //   before closing the writer.
  defaultWriter.ready
    .then(() => {
      defaultWriter.close();
    })
    .then(() => {
      console.log("All chunks written");
    })
    .catch((err) => {
      console.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");
        listItem.textContent = `Chunk decoded: ${decoded}`;
        list.appendChild(listItem);
        result += decoded;
        resolve();
      });
    },
    close() {
      const listItem = document.createElement("li");
      listItem.textContent = `[MESSAGE RECEIVED] ${result}`;
      list.appendChild(listItem);
    },
    abort(err) {
      console.log("Sink error:", err);
    },
  },
  queuingStrategy,
);

sendMessage("Hello, world.", writableStream);

您可以在我們的 簡單的寫入器示例 中檢視此內容的即時演示。

規範

規範
Streams
# ref-for-default-writer-close⑦

瀏覽器相容性