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②

浏览器兼容性

另见