WritableStreamDefaultWriter: close() 方法

基线 2022

新可用

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

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

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

在调用关闭行为之前,底层接收器将完成对之前写入的所有块的处理。在此期间,任何进一步的写入尝试都将失败(不会导致流出错)。

语法

js
close()

参数

无。

返回值

一个 Promise,如果在关闭之前成功写入所有剩余的块,则该 Promise 将使用 undefined 完成,如果在处理过程中遇到问题,则该 Promise 将使用错误拒绝。

异常

TypeError

您尝试关闭的流不是 WritableStream

示例

以下示例展示了使用自定义接收器和 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⑦

浏览器兼容性

BCD 表仅在浏览器中加载