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①

浏览器兼容性