WritableStreamDefaultWriter: write() 方法

Baseline 已廣泛支援

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

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

write() 方法是 WritableStreamDefaultWriter 介面的一個方法,它將傳入的資料塊寫入 WritableStream 及其底層接收器,然後返回一個 Promise,該 Promise 在寫入操作成功或失敗時解析。

請注意,“成功”的含義取決於底層接收器;它可能表示資料塊已被接受,而不一定表示它已安全儲存到最終目的地。

語法

js
write(chunk)

引數

chunk

要傳遞給 WritableStream 的二進位制資料塊。

返回值

一個 Promise,在寫入成功時以 undefined 解析,如果寫入失敗或流在寫入過程啟動之前出錯,則會拒絕。

異常

TypeError

目標流不是一個可寫流,或者它沒有所有者。

示例

下面的示例演示瞭如何建立具有自定義接收器和 API 提供的佇列策略的 WritableStream。然後,它呼叫一個名為 sendMessage() 的函式,並將新建立的流和一個字串作為引數傳遞。在此函式內部,它呼叫流的 getWriter() 方法,該方法返回一個 WritableStreamDefaultWriter 例項。呼叫 forEach() 來將字串的每個塊寫入流。最後,write()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-write①②

瀏覽器相容性