ReadableStreamDefaultReader: cancel() 方法

Baseline 已廣泛支援

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2020 年 1 月⁩ 起,所有主流瀏覽器均已支援。

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

ReadableStreamDefaultReader 介面的 cancel() 方法返回一個 Promise,該 Promise 在流被取消時解析。呼叫此方法表示消費者已不再對該流感興趣。

當您已完全使用完流並且不再需要其中任何資料時,可以使用 cancel。即使有待讀取的待處理塊,呼叫 cancel 後,這些資料也會丟失,並且流將不再可讀。如果您仍想讀取這些塊而不完全丟棄流,可以使用 ReadableStreamDefaultController.close()

注意: 如果讀取器處於活動狀態,則 cancel() 方法的行為與關聯流的 cancel() 方法 (ReadableStream.cancel()) 相同。

語法

js
cancel()
cancel(reason)

引數

reason 可選

取消的可讀原因。此值可能會被使用,也可能不會被使用。

返回值

一個 Promise,它以 reason 引數中給定的值實現。

異常

TypeError

源物件不是 ReadableStreamDefaultReader,或者流沒有所有者。

示例

在以下簡單示例中,使用透過 getReader() 建立的 ReadableStreamDefaultReader 讀取先前建立的自定義 ReadableStream。(此程式碼基於我們的 簡單隨機流示例)。每個塊按順序讀取並輸出到 UI,直到流讀取完畢,此時我們從遞迴函式中返回,並將整個流列印到 UI 的另一部分。

當流結束時(if (done)),我們執行 reader.cancel() 來取消流,表示我們不再需要使用它。

js
function fetchStream() {
  const reader = stream.getReader();
  let charsReceived = 0;

  // read() returns a promise that resolves
  // when a value has been received
  reader.read().then(function processText({ done, value }) {
    // Result objects contain two properties:
    // done  - true if the stream has already given you all its data.
    // value - some data. Always undefined when done is true.
    if (done) {
      console.log("Stream complete");
      reader.cancel();
      para.textContent = result;
      return;
    }

    // value for fetch streams is a Uint8Array
    charsReceived += value.length;
    const chunk = value;
    let listItem = document.createElement("li");
    listItem.textContent = `Received ${charsReceived} characters so far. Current chunk = ${chunk}`;
    list2.appendChild(listItem);

    result += chunk;

    // Read some more, and call this function again
    return reader.read().then(processText);
  });
}

規範

規範
Streams
# ref-for-generic-reader-cancel②

瀏覽器相容性

另見