ReadableStreamBYOBReader
注意:此功能在Web 工作线程中可用。
ReadableStreamBYOBReader
接口是 流 API 的一部分,它定义了一个用于 ReadableStream
的读取器,该读取器支持从底层字节源进行零拷贝读取。它用于从底层源(例如文件)高效地复制数据,其中数据以“匿名”字节序列的形式传递。
此读取器类型的实例通常应通过在流上调用 ReadableStream.getReader()
并指定选项参数中的 mode: "byob"
来获取。可读流必须具有底层字节源。换句话说,它必须已使用 type: "bytes"
指定底层源进行构建。
使用这种读取器,当可读流的内部队列为空时,read()
请求将导致从底层源进行零拷贝传输(绕过流的内部队列)。如果内部队列不为空,则 read()
将从缓冲数据中满足请求。
请注意,方法和属性与默认读取器 (ReadableStreamDefaultReader
) 的方法和属性类似。read()
方法的不同之处在于它提供了一个用于写入数据的视图。
构造函数
ReadableStreamBYOBReader()
-
创建并返回一个
ReadableStreamBYOBReader
对象实例。
实例属性
ReadableStreamBYOBReader.closed
只读-
返回一个
Promise
,当流关闭时,该 Promise 将 fulfilled,如果流抛出错误或读取器的锁被释放,则该 Promise 将 rejected。此属性使您能够编写响应流处理结束的代码。
实例方法
ReadableStreamBYOBReader.cancel()
-
返回一个
Promise
,该 Promise 在流被取消时解析。调用此方法表示消费者不再对流感兴趣。提供的reason
参数将传递给底层源,底层源可能会或可能不会使用它。 ReadableStreamBYOBReader.read()
-
传递一个必须将数据写入其中的视图,并返回一个
Promise
,该 Promise 将解析为流中的下一个块,或者拒绝指示流已关闭或发生错误。 ReadableStreamBYOBReader.releaseLock()
-
释放读取器对流的锁定。
示例
下面的示例取自 使用可读字节流 中的实时示例。
首先使用流上的 ReadableStream.getReader()
创建读取器,并在选项参数中指定 mode: "byob"
。由于这是一个“自带缓冲区”读取器,因此我们还需要创建一个 ArrayBuffer
来读取数据。
const reader = stream.getReader({ mode: "byob" });
let buffer = new ArrayBuffer(200);
下面显示了一个使用读取器的函数。此函数递归地调用 read()
方法以将数据读取到缓冲区中。该方法采用一个 Uint8Array
类型化数组,该数组是原始数组缓冲区中尚未写入的部分的视图。视图的参数是从先前调用中接收到的数据计算出来的,这些数据定义了原始数组缓冲区中的偏移量。
readStream(reader);
function readStream(reader) {
let bytesReceived = 0;
let offset = 0;
// read() returns a promise that resolves when a value has been received
reader
.read(new Uint8Array(buffer, offset, buffer.byteLength - offset))
.then(function processText({ done, value }) {
// Result objects contain two properties:
// done - true if the stream has already given all its data.
// value - some data. Always undefined when done is true.
if (done) {
logConsumer(`readStream() complete. Total bytes: ${bytesReceived}`);
return;
}
buffer = value.buffer;
offset += value.byteLength;
bytesReceived += value.byteLength;
logConsumer(
`Read ${value.byteLength} (${bytesReceived}) bytes: ${value}`,
);
result += value;
// Read some more, and call this function again
return reader
.read(new Uint8Array(buffer, offset, buffer.byteLength - offset))
.then(processText);
});
}
当流中没有更多数据时,read()
方法将解析为一个对象,该对象的 done
属性设置为 true
,并且函数返回。
ReadableStreamBYOBReader.closed
属性返回一个 Promise,该 Promise 可用于监视流是否已关闭或发生错误,或者读取器锁是否已释放。
reader.closed
.then(() => {
// Resolved - code to handle stream closing
})
.catch(() => {
// Rejected - code to handle error
});
要取消流调用 ReadableStreamBYOBReader.cancel()
,可以选择指定一个原因。这将返回一个 Promise,该 Promise 在流被取消后将解析。当流被取消时,控制器将依次在底层源上调用 cancel()
,并将可选的原因传递进去。
使用可读字节流
中的示例代码在按下按钮时调用取消方法,如下所示
button.addEventListener("click", () => {
reader.cancel("user choice").then(() => console.log("cancel complete"));
});
消费者还可以调用 releaseLock()
来释放读取器对流的保持,但前提是没有读取挂起
reader.releaseLock();
规范
规范 |
---|
流标准 # byob-reader-class |
浏览器兼容性
BCD 表格仅在浏览器中加载
另请参阅
- 流 API 概念
- 使用可读字节流
ReadableStream
- WHATWG 流可视化工具,用于可读、可写和转换流的基本可视化。
- Web-streams-polyfill 或 sd-streams - polyfills