ReadableStreamBYOBReader

可用性有限

此特性不是基線特性,因為它在一些最廣泛使用的瀏覽器中不起作用。

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

ReadableStreamBYOBReader 介面是 Streams API 的一部分,它定義了一個用於 ReadableStream 的讀取器,該讀取器支援從底層位元組源進行零複製讀取。它可用於從資料以“匿名”位元組序列形式提供的底層源(例如檔案)進行高效複製。

通常應該透過在流上呼叫 ReadableStream.getReader() 來獲取此讀取器型別的例項,並在選項引數中指定 mode: "byob"。可讀流必須具有底層位元組源。換句話說,它必須在 構造 時使用 type: "bytes" 指定了底層源。

使用此類讀取器時,當可讀流的內部佇列為空時發起的 read() 請求將導致從底層源進行零複製傳輸(繞過流的內部佇列)。如果內部佇列不為空,read() 將從緩衝的資料中滿足請求。

請注意,此讀取器的方法和屬性與預設讀取器(ReadableStreamDefaultReader)的方法和屬性類似。read() 方法的區別在於它提供了寫入資料的檢視。

建構函式

ReadableStreamBYOBReader()

建立並返回一個 ReadableStreamBYOBReader 物件例項。

例項屬性

ReadableStreamBYOBReader.closed 只讀

返回一個 Promise,當流關閉時該 Promise 將 fulfilled,或者在流丟擲錯誤或讀取器的鎖被釋放時 reject。此屬性使您能夠編寫響應流結束的程式碼。

例項方法

ReadableStreamBYOBReader.cancel()

返回一個 Promise,當流被取消時解析。呼叫此方法表示消費者對該流不再感興趣。提供的 reason 引數將傳遞給底層源,源可能會也可能不會使用它。

ReadableStreamBYOBReader.read()

傳遞一個必須寫入資料的檢視,並返回一個 Promise,該 Promise 將解析為流中的下一個塊,或 reject 並指示流已關閉或出錯。

ReadableStreamBYOBReader.releaseLock()

釋放讀取器對流的鎖定。

示例

下面的示例摘自 使用可讀位元組流 中的即時示例。

首先,透過在流上呼叫 ReadableStream.getReader() 並指定選項引數中的 mode: "byob" 來建立讀取器。由於這是一個“自帶緩衝區”讀取器,我們還需要建立一個 ArrayBuffer 來讀取資料。

js
const reader = stream.getReader({ mode: "byob" });
let buffer = new ArrayBuffer(200);

下面是一個使用該讀取器的函式。它遞迴呼叫 read() 方法將資料讀取到緩衝區中。該方法接受一個 Uint8Array 型別化陣列,該陣列是原始陣列緩衝區中尚未寫入部分的視覺化檢視。檢視的引數是根據先前呼叫中接收到的資料計算的,這些資料定義了原始陣列緩衝區的偏移量。

js
readStream(reader);

function readStream(reader) {
  let bytesReceived = 0;
  let offset = 0;

  // read() returns a promise that resolves when a value has been received
  reader
    .read(new Uint8Array(buffer, offset, buffer.byteLength - offset))
    .then(function processText({ done, value }) {
      // Result objects contain two properties:
      // done  - true if the stream has already given all its data.
      // value - some data. Always undefined when done is true.

      if (done) {
        logConsumer(`readStream() complete. Total bytes: ${bytesReceived}`);
        return;
      }

      buffer = value.buffer;
      offset += value.byteLength;
      bytesReceived += value.byteLength;

      logConsumer(
        `Read ${value.byteLength} (${bytesReceived}) bytes: ${value}`,
      );
      result += value;

      // Read some more, and call this function again
      return reader
        .read(new Uint8Array(buffer, offset, buffer.byteLength - offset))
        .then(processText);
    });
}

當流中沒有更多資料時,read() 方法將解析為一個屬性 done 設定為 true 的物件,然後函式返回。

ReadableStreamBYOBReader.closed 屬性返回一個 Promise,可用於監視流的關閉或錯誤,或者讀取器鎖的釋放。

js
reader.closed
  .then(() => {
    // Resolved - code to handle stream closing
  })
  .catch(() => {
    // Rejected - code to handle error
  });

要取消流,請呼叫 ReadableStreamBYOBReader.cancel(),可以選擇指定一個原因。這將返回一個 Promise,當流被取消時該 Promise 將解析。當流被取消時,控制器將依次呼叫底層源上的 cancel(),並將可選原因傳遞進去。

使用可讀位元組流 中的示例程式碼會在按鈕被按下時呼叫 cancel 方法,如下所示。

js
button.addEventListener("click", () => {
  reader.cancel("user choice").then(() => console.log("cancel complete"));
});

消費者還可以呼叫 releaseLock() 來釋放讀取器對流的持有,但前提是沒有待處理的讀取。

js
reader.releaseLock();

規範

規範
Streams
# byob-reader-class

瀏覽器相容性

另見