WritableStream:close() 方法

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

close() 方法是 WritableStream 接口的一部分,用于关闭关联的流。在调用此方法之前写入的所有块将在返回的 Promise fulfilled 之前发送。

这等效于使用 getWriter() 获取 WritableStreamDefaultWriter,然后在其上调用 close()

语法

js
close()

参数

无。

返回值

一个 Promise,当所有剩余的块在关闭之前成功写入时,它将以 undefined 作为 fulfilled 值,如果在此过程中遇到问题,则会以错误作为 rejected 值。

异常

TypeError

您尝试关闭的流已锁定。

示例

以下示例说明了 WritableStream 的几个特性。它展示了使用自定义接收器和 API 提供的排队策略创建 WritableStream 的过程。然后,它调用一个名为 sendMessage() 的函数,并将新创建的流和一个字符串作为参数传递。在该函数内部,它调用流的 getWriter() 方法,该方法返回一个 WritableStreamDefaultWriter 实例。forEach() 调用用于将字符串的每个块写入流。最后,write()close() 返回 Promise,这些 Promise 用于处理块和流的成功或失败。请注意,为了能够在流本身调用 close(),必须使用 defaultWriter.releaseLock(); 断开写入器的连接。

js
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);
      })
      .catch((err) => {
        log("Chunk error:", err);
      });
  });

  // Call ready again to ensure that all chunks are written
  //   before closing the writer.
  defaultWriter.ready
    .then(() => {
      defaultWriter.releaseLock();
      writableStream.close();
    })
    .then(() => {
      log("All chunks written / stream closed.");
    })
    .catch((err) => {
      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");
        result += decoded;
        resolve();
      });
    },
    close() {
      const listItem = document.createElement("li");
      log(`[MESSAGE RECEIVED] ${result}`);
    },
    abort(err) {
      log("Sink error:", err);
    },
  },
  queuingStrategy,
);

log("Sending 'Hello, world.' message.");
sendMessage("Hello, world.", writableStream);

规范

规范
流标准
# ref-for-ws-close①

浏览器兼容性

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