WritableStream:getWriter() 方法

基线 2022

新可用

2022 年 6 月起,此功能可在最新的设备和浏览器版本中使用。此功能可能在较旧的设备或浏览器中无法使用。

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

getWriter() 方法是 WritableStream 接口的方法,它返回一个新的 WritableStreamDefaultWriter 实例,并将流锁定到该实例。在流被锁定期间,无法获取其他写入器,直到此写入器被释放。

语法

js
getWriter()

参数

无。

返回值

一个 WritableStreamDefaultWriter 对象实例。

异常

TypeError

您尝试为其创建写入器的流不是 WritableStream,或者它已被锁定到另一个写入器。

示例

以下示例说明了此接口的几个功能。它展示了使用自定义接收器和 API 提供的排队策略创建 WritableStream 的过程。然后它调用一个名为 sendMessage() 的函数,将新创建的流和一个字符串作为参数传递。在该函数内部,它调用流的 getWriter() 方法,该方法返回一个 WritableStreamDefaultWriter 实例。使用 forEach() 调用将字符串的每个块写入流。最后,write()close() 返回 Promise,这些 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, { stream: true });
  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);

您可以在我们的 简单写入器示例中找到完整代码。

规范

规范
流标准
# ref-for-ws-get-writer①

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。