可读流:getReader() 方法
注意:此功能在Web Workers中可用。
getReader()
方法是 ReadableStream
接口的一个方法,它创建一个读取器并将其锁定到流上。在流被锁定期间,无法获取其他读取器,直到此读取器被释放。
语法
js
getReader()
getReader(options)
参数
options
可选-
包含以下属性的对象
mode
可选-
指定要创建的读取器类型的属性。值可以是
"byob"
,这将导致创建一个ReadableStreamBYOBReader
,它可以读取可读字节流(当内部流缓冲区为空时,支持从底层字节源到读取器的零拷贝传输的流)。undefined
(或根本未指定 - 这是默认值),这将导致创建一个ReadableStreamDefaultReader
,它可以从流中读取单个块。
返回值
一个 ReadableStreamDefaultReader
或 ReadableStreamBYOBReader
对象实例,具体取决于 mode
值。
异常
RangeError
-
如果提供的 mode 值不是
"byob"
或undefined
,则抛出此异常。 TypeError
-
如果您尝试为其创建读取器的流已被锁定或不是
ReadableStream
,则抛出此异常。如果请求了 BYOB 读取器并且流控制器不是ReadableByteStreamController
(流不是 构造 为具有type="bytes"
的底层源),则也会抛出此异常。
示例
在以下简单示例中,先前创建的自定义 ReadableStream
使用使用 getReader()
创建的 ReadableStreamDefaultReader
读取。(有关完整代码,请参阅我们的 简单随机流示例)。每个块按顺序读取并输出到 UI,直到流读取完成,此时我们从递归函数返回并将整个流打印到 UI 的另一部分。
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");
para.textContent = value;
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-rs-get-reader⑤ |
浏览器兼容性
BCD 表仅在启用 JavaScript 的浏览器中加载。