此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。

View in English Always switch to English

TransformStreamDefaultController

基线 广泛可用

自 2022年6月 起,此特性已在主流浏览器中得到支持,可在大多数设备和浏览器版本中正常使用。

备注: 此特性在 Web Worker 中可用。

流 APITransformStreamDefaultController 接口提供了操作关联的 ReadableStreamWritableStream 的方法。

当构造 TransformStream 时,会创建一个 TransformStreamDefaultController。因此它没有构造函数。获取 TransformStreamDefaultController 实例的方式是通过 TransformStream() 的回调方法。

实例属性

TransformStreamDefaultController.desiredSize 只读

返回填充满流内部队列的可读端所需要的大小。

实例方法

TransformStreamDefaultController.enqueue()

将一个分块(单个数据单元)加入流的可读端队列。

TransformStreamDefaultController.error()

使转换流的可写端和可读端都报告错误。

TransformStreamDefaultController.terminate()

关闭流的可读端,并使流的可写端报告错误。

示例

在下面的示例中,一个转换流接收所有的分块将其转换为 Uint8Array 值,使用了 error()enqueue() 方法。

js
const transformContent = {
  start() {}, // 必需
  async transform(chunk, controller) {
    chunk = await chunk;
    switch (typeof chunk) {
      case "object":
        // 流大概结束了
        if (chunk === null) {
          controller.terminate();
        } else if (ArrayBuffer.isView(chunk)) {
          controller.enqueue(
            new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength),
          );
        } else if (
          Array.isArray(chunk) &&
          chunk.every((value) => typeof value === "number")
        ) {
          controller.enqueue(new Uint8Array(chunk));
        } else if (
          typeof chunk.valueOf === "function" &&
          chunk.valueOf() !== chunk
        ) {
          this.transform(chunk.valueOf(), controller); // hack
        } else if ("toJSON" in chunk) {
          this.transform(JSON.stringify(chunk), controller);
        }
        break;
      case "symbol":
        controller.error("无法将 Symbol 作为分块部分发送");
        break;
      case "undefined":
        controller.error("无法将 undefined 作为分块部分发送");
        break;
      default:
        controller.enqueue(this.textencoder.encode(String(chunk)));
        break;
    }
  },
  flush() {
    /* 做一些清理工作 */
  },
};

class AnyToU8Stream extends TransformStream {
  constructor() {
    super({ ...transformContent, textencoder: new TextEncoder() });
  }
}

规范

规范
Streams
# ts-default-controller-class

浏览器兼容性