WritableStreamDefaultWriter

Baseline 已广泛支持

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

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

WritableStreamDefaultWriter 接口是 Streams API 的一部分,由 WritableStream.getWriter() 返回。创建后,它会将 writer 锁定到 WritableStream,确保没有其他流可以写入底层接收器。

构造函数

WritableStreamDefaultWriter()

创建一个新的 WritableStreamDefaultWriter 对象实例。

实例属性

WritableStreamDefaultWriter.closed 只读

允许你编写响应流结束的代码。返回一个 Promise,如果流关闭则 fulfilled,如果流出错或 writer 的锁被释放则 rejected。

WritableStreamDefaultWriter.desiredSize 只读

返回填充流内部队列所需的期望大小。

WritableStreamDefaultWriter.ready 只读

返回一个 Promise,当流的内部队列的期望大小从非正值变为正值时解决,表明不再应用背压。

实例方法

WritableStreamDefaultWriter.abort()

中止流,表明生产者无法再成功写入流,流将被立即移至错误状态,任何已排队的写入都将被丢弃。

WritableStreamDefaultWriter.close()

关闭关联的可写流。

WritableStreamDefaultWriter.releaseLock()

释放 writer 对相应流的锁定。释放锁定后,writer 将不再处于活动状态。如果在释放锁定后关联的流出错,writer 将从此开始以相同方式出错;否则,writer 将显示为已关闭。

WritableStreamDefaultWriter.write()

将传入的数据块写入 WritableStream 及其底层接收器,然后返回一个 Promise,该 Promise 解决以指示写入操作的成功或失败。

示例

以下示例显示了使用自定义接收器和 API 提供的队列策略创建 WritableStream。然后它调用一个名为 sendMessage() 的函数,并将新创建的流和一个字符串传递进去。在此函数内部,它调用流的 getWriter() 方法,该方法返回 WritableStreamDefaultWriter 的一个实例。使用 forEach() 调用将字符串的每个块写入流。最后,write()close() 返回 Promise,这些 Promise 被处理以处理块和流的成功或失败。

js
const list = document.querySelector("ul");

async function sendMessage(message, writableStream) {
  // defaultWriter is of type WritableStreamDefaultWriter
  const defaultWriter = writableStream.getWriter();
  const encoder = new TextEncoder();
  const encoded = encoder.encode(message);

  try {
    for (const chunk of encoded) {
      await defaultWriter.ready;
      await defaultWriter.write(chunk);
      console.log("Chunk written to sink.");
    }
    // Call ready again to ensure that all chunks are written
    // before closing the writer.
    await defaultWriter.ready;
    await defaultWriter.close();
    console.log("All chunks written");
  } catch (err) {
    console.log("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
# default-writer-class

浏览器兼容性