TransformStreamDefaultController

Baseline 已廣泛支援

此特性已得到充分確立,可在多種裝置和瀏覽器版本上執行。自 ⁨2022 年 6 月⁩起,所有瀏覽器均支援此特性。

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

TransformStreamDefaultController 介面是 Streams API 的一部分,提供了用於操作關聯的 ReadableStreamWritableStream 的方法。

在構造 TransformStream 時,會建立 TransformStreamDefaultController。因此,它沒有建構函式。獲取 TransformStreamDefaultController 例項的方式是透過 TransformStream() 的回撥方法。

例項屬性

TransformStreamDefaultController.desiredSize 只讀

返回用於填充流內部佇列的可讀端的期望大小。

例項方法

TransformStreamDefaultController.enqueue()

在流的可讀端排隊一個塊(單個數據片段)。

TransformStreamDefaultController.error()

使轉換流的可讀端和可寫端都出錯。

TransformStreamDefaultController.terminate()

關閉流的可讀端並使流的可寫端出錯。

示例

在下面的示例中,一個轉換流使用 error()enqueue() 方法,將接收到的所有塊作為 Uint8Array 值進行透傳。

js
const transformContent = {
  start() {}, // required.
  async transform(chunk, controller) {
    chunk = await chunk;
    switch (typeof chunk) {
      case "object":
        // just say the stream is done I guess
        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("Cannot send a symbol as a chunk part");
        break;
      case "undefined":
        controller.error("Cannot send undefined as a chunk part");
        break;
      default:
        controller.enqueue(this.textencoder.encode(String(chunk)));
        break;
    }
  },
  flush() {
    /* do any destructor work here */
  },
};

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

規範

規範
Streams
# ts-default-controller-class

瀏覽器相容性