ReadableStreamDefaultReader: cancel() 方法

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

cancel() 方法是 ReadableStreamDefaultReader 接口的一部分,它返回一个 Promise,该承诺在流被取消时解析。调用此方法表示消费者对流不再感兴趣。

当您完全使用完流并且不再需要从流中获取更多数据时,即使有排队的块正在等待读取,也要使用取消。在调用取消后,这些数据将丢失,并且流不再可读。若要读取这些块并保留流,可以使用 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);
  });
}

规范

规范
流标准
# ref-for-generic-reader-cancel②

浏览器兼容性

BCD 表仅在浏览器中加载

另请参阅