WritableStreamDefaultWriter: write() 方法

Baseline 已广泛支持

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

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

write() 方法是 WritableStreamDefaultWriter 接口的一个方法,它将传入的数据块写入 WritableStream 及其底层接收器,然后返回一个 Promise,该 Promise 在写入操作成功或失败时解析。

请注意,“成功”的含义取决于底层接收器;它可能表示数据块已被接受,而不一定表示它已安全保存到最终目的地。

语法

js
write(chunk)

参数

chunk

要传递给 WritableStream 的二进制数据块。

返回值

一个 Promise,在写入成功时以 undefined 解析,如果写入失败或流在写入过程启动之前出错,则会拒绝。

异常

TypeError

目标流不是一个可写流,或者它没有所有者。

示例

下面的示例演示了如何创建具有自定义接收器和 API 提供的队列策略的 WritableStream。然后,它调用一个名为 sendMessage() 的函数,并将新创建的流和一个字符串作为参数传递。在此函数内部,它调用流的 getWriter() 方法,该方法返回一个 WritableStreamDefaultWriter 实例。调用 forEach() 来将字符串的每个块写入流。最后,write()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-write①②

浏览器兼容性