WritableStreamDefaultWriter

Baseline 已廣泛支援

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

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

WritableStreamDefaultWriter 介面是 Streams API 的一部分,由 WritableStream.getWriter() 返回。建立後,它會將 writer 鎖定到 WritableStream,確保沒有其他流可以寫入底層接收器。

建構函式

WritableStreamDefaultWriter()

建立一個新的 WritableStreamDefaultWriter 物件例項。

例項屬性

WritableStreamDefaultWriter.closed 只讀

允許你編寫響應流結束的程式碼。返回一個 Promise,如果流關閉則 fulfilled,如果流出錯或 writer 的鎖被釋放則 rejected。

WritableStreamDefaultWriter.desiredSize 只讀

返回填充流內部佇列所需的期望大小。

WritableStreamDefaultWriter.ready 只讀

返回一個 Promise,當流的內部佇列的期望大小從非正值變為正值時解決,表明不再應用背壓。

例項方法

WritableStreamDefaultWriter.abort()

中止流,表明生產者無法再成功寫入流,流將被立即移至錯誤狀態,任何已排隊的寫入都將被丟棄。

WritableStreamDefaultWriter.close()

關閉關聯的可寫流。

WritableStreamDefaultWriter.releaseLock()

釋放 writer 對相應流的鎖定。釋放鎖定後,writer 將不再處於活動狀態。如果在釋放鎖定後關聯的流出錯,writer 將從此開始以相同方式出錯;否則,writer 將顯示為已關閉。

WritableStreamDefaultWriter.write()

將傳入的資料塊寫入 WritableStream 及其底層接收器,然後返回一個 Promise,該 Promise 解決以指示寫入操作的成功或失敗。

示例

以下示例顯示了使用自定義接收器和 API 提供的佇列策略建立 WritableStream。然後它呼叫一個名為 sendMessage() 的函式,並將新建立的流和一個字串傳遞進去。在此函式內部,它呼叫流的 getWriter() 方法,該方法返回 WritableStreamDefaultWriter 的一個例項。使用 forEach() 呼叫將字串的每個塊寫入流。最後,write()close() 返回 Promise,這些 Promise 被處理以處理塊和流的成功或失敗。

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

async function sendMessage(message, writableStream) {
  // defaultWriter is of type WritableStreamDefaultWriter
  const defaultWriter = writableStream.getWriter();
  const encoder = new TextEncoder();
  const encoded = encoder.encode(message);

  try {
    for (const chunk of encoded) {
      await defaultWriter.ready;
      await defaultWriter.write(chunk);
      console.log("Chunk written to sink.");
    }
    // Call ready again to ensure that all chunks are written
    // before closing the writer.
    await defaultWriter.ready;
    await defaultWriter.close();
    console.log("All chunks written");
  } catch (err) {
    console.log("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
# default-writer-class

瀏覽器相容性