WritableStreamDefaultWriter

基线 2022

最新可用

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

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

WritableStreamDefaultWriterStreams API 的一个接口,它是由 WritableStream.getWriter() 返回的对象,一旦创建,它就会将编写器锁定到 WritableStream,确保没有其他流可以写入底层接收器。

构造函数

WritableStreamDefaultWriter()

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

实例属性

WritableStreamDefaultWriter.closed 只读

允许您编写代码以响应流处理的结束。如果流变为关闭状态,则返回一个完成的 Promise,否则如果流出错或编写器的锁被释放,则返回一个拒绝的 Promise。

WritableStreamDefaultWriter.desiredSize 只读

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

WritableStreamDefaultWriter.ready 只读

返回一个 Promise,当流的内部队列的所需大小从非正数变为正数时,该 Promise 会解决,表明它不再应用背压。

实例方法

WritableStreamDefaultWriter.abort()

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

WritableStreamDefaultWriter.close()

关闭关联的可写流。

WritableStreamDefaultWriter.releaseLock()

释放编写器对相应流的锁。释放锁后,编写器将不再活动。如果关联的流在锁被释放时出错,则编写器从现在起将以相同的方式显示出错;否则,编写器将显示已关闭。

WritableStreamDefaultWriter.write()

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

示例

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

浏览器兼容性

BCD 表格仅在浏览器中加载