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 Standard # ref-for-generic-reader-cancel② |
浏览器兼容性
BCD tables only load in the browser