ReadableStreamDefaultReader.cancel()

ReadableStreamDefaultReader 接口的 cancel() 方法返回一个 Promise,这个 promise 在流被取消时兑现。消费者在流中调用该方法发出取消流的信号。

cancel 用于在不再需要来自一个流的任何数据的情况下完全结束这个流,即使仍有排队等待的数据块。调用 cancel 后该数据丢失,并且流不再可读。为了仍然可以读这些数据块而不完全结束这个流,你应该使用 ReadableStreamDefaultController.close()

备注: 如果 reader 处于激活状态,cancel() 方法的行为和关联流 (ReadableStream.cancel()) 的行为相同。

语法

js
cancel()
cancel(reason)

参数

reason 可选

人类可读的取消原因。这个值可能会被使用。

返回值

一个 Promise,会在结束时使用给定的 reason 参数兑现。

异常

TypeError

源对象不是 ReadableStreamDefaultReader,或者流没有所有者。

示例

在下面的简单示例中,使用 getReader() 创建的 ReadableStreamDefaultReader 读取先前自定义的 ReadableStream。(有关完整代码简单随机流演示)。直到流完成读取,每一个块都按顺序读取并输出到 UI,此时我们退出递归函数并且将整个流打印到 UI 的另一部分。

js
function fetchStream() {
  const reader = stream.getReader();
  let charsReceived = 0;
  // read() 返回一个 promise,其会在接收到数据时被兑现
  reader.read().then(function processText({ done, value }) {
    // 结果包含两个属性:
    // done  - 如果为 true,表示流已经返回所有的数据。
    // value - 一些数据,done 为 true 时,其值始终为 undefined。
    if (done) {
      console.log("Stream complete");
      para.textContent = result;
      return;
    }
    // 从流中获取的数据是一个 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;
    // 再次调用该函数以读取更多数据
    return reader.read().then(processText);
  });
}

规范

Specification
Streams
# ref-for-generic-reader-cancel②

浏览器兼容性

Report problems with this compatibility data on GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
cancel

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support

参见