ReadableStream: getReader() 方法
注意:此功能在 Web Workers 中可用。
ReadableStream 接口的 getReader() 方法会创建一个 reader 并将流锁定给该 reader。当流被锁定后,在释放该 reader 之前,无法获取其他 reader。
语法
js
getReader()
getReader(options)
参数
options可选-
包含以下属性的对象:
mode可选-
一个指定要创建的 reader 类型的属性。值可以是
"byob",它会创建一个ReadableStreamBYOBReader,它可以读取可读字节流(当内部流缓冲区为空时,支持从底层字节源到 reader 的零拷贝传输的流)。undefined(或根本不指定 — 这是默认值),它会创建一个ReadableStreamDefaultReader,它可以从流中读取单个块。
返回值
一个 ReadableStreamDefaultReader 或 ReadableStreamBYOBReader 对象实例,具体取决于 mode 的值。
异常
RangeError-
如果提供的 mode 值不是
"byob"或undefined,则会抛出此错误。 TypeError-
如果你试图为其创建 reader 的流已经被锁定,或者不是一个
ReadableStream,则会抛出此错误。如果请求 BYOB reader 但流控制器不是ReadableByteStreamController(该流不是通过type="bytes"的 构造 函数设置的底层源),也会抛出此错误。
示例
在下面的简单示例中,使用 getReader() 创建的 ReadableStreamDefaultReader 读取了一个先前创建的自定义 ReadableStream。(有关完整代码,请参阅我们的 简单随机流示例)。每个块被依次读取并输出到 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);
});
}
规范
| 规范 |
|---|
| Streams # ref-for-rs-get-reader⑤ |
浏览器兼容性
加载中…
另见
ReadableStream()构造函数ReadableStreamDefaultReaderReadableStreamBYOBReader- 使用可读流
- 使用可读字节流