WritableStreamDefaultWriter: write() 方法

基线 2022

新可用

2022 年 6 月起,此功能适用于最新的设备和浏览器版本。此功能可能不适用于旧设备或浏览器。

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

write() 方法是 WritableStreamDefaultWriter 接口的一部分,用于将传递的数据块写入 WritableStream 及其底层接收器,然后返回一个 Promise,该 promise 解析以指示写入操作的成功或失败。

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

语法

js
write(chunk)

参数

chunk

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

返回值

一个 Promise,它在成功写入时用 undefined 完成,或者在写入失败或流在写入过程启动之前出现错误时拒绝。

异常

TypeError

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

示例

以下示例演示了使用自定义接收器和 API 提供的排队策略创建 WritableStream 的过程。然后,它调用名为 sendMessage() 的函数,并将新创建的流和一个字符串传递给它。在这个函数中,它调用流的 getWriter() 方法,该方法返回 WritableStreamDefaultWriter 的一个实例。forEach() 调用用于将字符串的每个块写入流。最后,write()close() 返回 promise,这些 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);

你可以在我们的 简单写入器示例 中找到完整代码。

规范

规范
流标准
# ref-for-default-writer-write①②

浏览器兼容性

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