WritableStreamDefaultWriter - 表示 WritableStream.getWriter() 返回的对象

这是一个实验中的功能
此功能某些浏览器尚在开发中,请参考浏览器兼容性表格以得到在不同浏览器中适合使用的前缀。由于该功能对应的标准文档可能被重新修订,所以在未来版本的浏览器中该功能的语法和行为可能随之改变。

WritableStreamDefaultWriterStreams API 的接口,表示 WritableStream.getWriter() 返回的对象,创建后,将写入器锁定到 WritableStream,以确保其他任何流都无法写入基础接收器。

构造函数

WritableStreamDefaultWriter()

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

属性

WritableStreamDefaultWriter.closed 只读

允许您编写响应流式传输过程结束的代码。返回一个承诺,该承诺在流关闭或释放写入器的锁时实现,或者在流错误时拒绝。

WritableStreamDefaultWriter.desiredSize 只读

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

WritableStreamDefaultWriter.ready 只读

返回一个 Promise,当流的内部队列的所需大小从非正向正向转变时,将进行解析,表示不再使用反压。

方法

WritableStreamDefaultWriter.abort()

中止该流,表明生产者无法再成功写入该流,并且应立即将其移至错误状态,并丢弃所有排队的写操作。

WritableStreamDefaultWriter.close()

关闭关联的可写流。

WritableStreamDefaultWriter.releaseLock()

释放写入器在相应流上的锁定。释放锁定后,写入器不再处于活动状态。如果释放锁时关联的流出错,则从现在开始,写入器将一直返回同样的错误;否则,写入器将会关闭。

WritableStreamDefaultWriter.write()

将传递的数据块写入 WritableStream 及其基础接收器,然后返回一个 Promise,该数据解析为指示写操作的成功或失败。

实例

以下实例说明了此接口的一些功能。它显示了使用自定义接收器和 API 提供的排队策略创建 WritableStream 的过程。然后,它调用一个名为 sendMessage() 的函数,传递新创建的流和一个字符串。在此函数内,它调用流的 getWriter() 方法,该方法返回一个 WritableStreamDefaultWriter 的实例。接着调用 forEach() 将字符串的每个块写入流中。最后,write()close() 返回处理块和流为成功或失败的承诺。

const list = document.querySelector('ul');

function sendMessage(message, writableStream) {
  // defaultWriter 的类型为 WritableStreamDefaultWriter
  const defaultWriter = writableStream.getWriter();
  const encoder = new TextEncoder();
  const encoded = encoder.encode(message, { stream: true });
  encoded.forEach((chunk) => {
    defaultWriter.ready
      .then(() => {
        return defaultWriter.write(chunk);
      })
      .then(() => {
        console.log("块写入接收器。");
      })
      .catch((err) => {
        console.log("块错误:", err);
      });
  });
  // 在关闭写入器之前,再次调用就绪以确保所有块均已写入。
  defaultWriter.ready
    .then(() => {
      defaultWriter.close();
    })
    .then(() => {
      console.log("所有的块已写入。");
    })
    .catch((err) => {
      console.log("流错误:", err);
    });
}

const decoder = new TextDecoder("utf-8");
const queuingStrategy = new CountQueuingStrategy({ highWaterMark: 1 });
let result = "";
const writableStream = new WritableStream({
  // 实现接收器
  write(chunk) {
    return new Promise((resolve, reject) => {
      var buffer = new ArrayBuffer(2);
      var view = new Uint16Array(buffer);
      view[0] = chunk;
      var decoded = decoder.decode(view, { stream: true });
      var listItem = document.createElement('li');
      listItem.textContent = "块解码:" + decoded;
      list.appendChild(listItem);
      result += decoded;
      resolve();
    });
  },
  close() {
    var listItem = document.createElement('li');
    listItem.textContent = "[收到消息] " + result;
    list.appendChild(listItem);
  },
  abort(err) {
    console.log("接收器错误:", err);
  }
}, queuingStrategy);

sendMessage("Hello, world.", writableStream);

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

规范

规范 状态 备注
Streams
WritableStreamDefaultWriter 的定义
现行的标准 初始定义。

桌面浏览器兼容性

特性ChromeEdgeFirefoxInternet ExplorerOperaSafari
基础支持5916 不支持 不支持46 未知
WritableStreamDefaultWriter() 构造函数5916 不支持 不支持46 未知
abort5916 不支持 不支持46 未知
close5916 不支持 不支持46 未知
closed5916 不支持 不支持46 未知
desiredSize5916 不支持 不支持46 未知
ready5916 不支持 不支持46 未知
releaseLock5916 不支持 不支持46 未知
write5916 不支持 不支持46 未知

移动浏览器兼容性

特性AndroidChrome for AndroidEdge mobileFirefox for AndroidIE mobileOpera AndroidiOS Safari
基础支持5959 未知 不支持 未知43 未知
WritableStreamDefaultWriter() 构造函数5959 未知 不支持 未知43 未知
abort5959 未知 不支持 未知43 未知
close5959 未知 不支持 未知43 未知
closed5959 未知 不支持 未知43 未知
desiredSize5959 未知 不支持 未知43 未知
ready5959 未知 不支持 未知43 未知
releaseLock5959 未知 不支持 未知43 未知
write5959 未知 不支持 未知43 未知