WritableStream: getWriter() 方法

Baseline 已廣泛支援

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

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

WritableStream 介面的 getWriter() 方法返回一個 WritableStreamDefaultWriter 的新例項,並將流鎖定到該例項。只要流被鎖定,在當前 writer 被釋放之前,就不能獲取其他 writer。

語法

js
getWriter()

引數

無。

返回值

一個 WritableStreamDefaultWriter 物件例項。

異常

TypeError

您嘗試為其建立 writer 的流不是 WritableStream,或者它已被鎖定到另一個 writer。

示例

以下示例說明了此介面的幾個特性。它展示了使用自定義接收器和 API 提供的排隊策略建立 WritableStream。然後,它呼叫一個名為 sendMessage() 的函式,並將新建立的流和字串傳遞給它。在此函式內部,它呼叫流的 getWriter() 方法,該方法返回一個 WritableStreamDefaultWriter 例項。使用 forEach() 呼叫將字串的每個塊寫入流。最後,write()close() 返回 promises,這些 promises 被處理以應對塊和流的成功或失敗。

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-ws-get-writer①

瀏覽器相容性