WritableStreamDefaultWriter: close() 方法

Baseline 已广泛支持

此功能已成熟,并可在许多设备和浏览器版本上使用。自 2022 年 5 月以来,它已在各个浏览器中可用。

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

close() 方法是 WritableStreamDefaultWriter 接口的一部分,用于关闭关联的可写流。

底层接收器(sink)将完成处理任何先前已写入的数据块,然后才会调用关闭行为。在此期间,任何进一步的写入尝试都将失败(但不会导致流出错)。

语法

js
close()

参数

无。

返回值

一个 Promise,如果所有剩余的数据块在关闭前都已成功写入,则会以 undefined fulfilled,如果在此过程中遇到任何问题,则会以错误 reject。

异常

TypeError

您尝试关闭的流不是 WritableStream

示例

以下示例展示了如何创建一个具有自定义接收器(sink)和 API 提供的排队策略的 WritableStream。然后,它调用一个名为 sendMessage() 的函数,并将新创建的流和一个字符串作为参数传递。在此函数内部,它调用流的 getWriter() 方法,该方法返回一个 WritableStreamDefaultWriter 实例。使用 write() 方法将编码字符串的每个数据块写入流,并使用编码后的 Uint8ArrayforEach() 方法逐字节处理。最后,调用 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-close⑦

浏览器兼容性