ReadableStreamBYOBRequest
注意:此功能在 Web Workers 中可用。
ReadableStreamBYOBRequest
是 Streams API 的接口,表示对来自底层来源的数据的“拉取请求”,该请求将作为零拷贝传输到消费者(绕过流的内部队列)。
当消费者请求数据且流的内部队列为空时,ReadableStreamBYOBRequest
对象将在“BYOB 模式”下创建。(如果流已经缓冲了数据,则会直接解决消费者的请求。)底层字节源可以通过其控制器的 ReadableByteStreamController.byobRequest
属性访问活动 BYOB 请求,如果不存在未完成的请求,该属性将设置为 null
。
支持“BYOB 模式”的底层源应检查 ReadableByteStreamController.byobRequest
,如果存在,必须使用它来传输数据。如果数据在 ReadableByteStreamController.byobRequest
为 null
时从底层源到达,则可以使用 ReadableByteStreamController.enqueue()
进行排队。当流的内部缓冲区未满时,底层推送源收到新数据时可能会发生这种情况。
底层源通过将数据写入 BYOB 请求的 view
然后调用 respond()
来使用该请求,或者通过调用 respondWithNewView()
并传递一个新视图作为参数来使用该请求。请注意,“新视图”实际上必须是对与原始 view
相同的缓冲区的视图,从相同的偏移量开始。这可能用于返回一个较短的缓冲区,如果底层源无法填充整个原始视图。
请注意,只有当在 ReadableStream()
构造函数 中为源指定 type="bytes"
时,才会为底层源创建 ReadableByteStreamController
。“BYOB 模式”在 ReadableController()
构造函数 中指定 autoAllocateChunkSize
或使用 ReadableStreamBYOBReader
(通常通过用参数 { mode: 'byob' }
调用 ReadableStream.getReader()
来构造)时启用。
构造函数
无。ReadableStreamBYOBRequest
实例由 ReadableByteStreamController
按需自动创建。
实例属性
ReadableStreamBYOBRequest.view
只读-
返回当前视图。这是对将被传输到消费者的缓冲区的视图,当调用
ReadableStreamBYOBRequest.respond()
时会发生这种情况。
实例方法
ReadableStreamBYOBRequest.respond()
-
向关联的可读字节流发出信号,表示指定数量的字节已写入当前
view
中,这将导致消费者的挂起请求得到解决。请注意,此方法调用后,view
将被传输,不再可修改。 ReadableStreamBYOBRequest.respondWithNewView()
-
向关联的可读字节流发出信号,表示作为参数传递的视图应传输到可读字节流的消费者。此新视图必须使用与原始
view
相同的缓冲区,从相同的偏移量开始,并且长度相同或更短。请注意,此方法调用后,view
将被传输,不再可修改。
示例
以下代码来自 使用可读字节流 > 创建可读套接字推送字节流 中的实时示例。
具有要传输数据的推送底层字节源应首先检查 controller.byobRequest
是否为非 null
。拉取底层字节源如果未启用自动块分配并且与默认读取器一起使用,则只需要此检查。
if (controller.byobRequest) {
/* code to transfer data */
}
有两种方法可以将数据读入 ReadableStreamBYOBRequest
然后传输它。第一种方法是将数据写入 ReadableStreamBYOBRequest.view
属性,然后调用 ReadableStreamBYOBRequest.respond()
以指示要传输的数据量。操作完成后,byobRequest.view
将被分离,并且请求应被丢弃。
以下代码展示了使用假设的 readInto()
方法将数据复制到视图中的情况
const v = controller.byobRequest.view;
bytesRead = socket.readInto(v.buffer, v.byteOffset, v.byteLength);
controller.byobRequest.respond(bytesRead);
另一种方法是调用 ReadableStreamBYOBRequest.respondWithNewView()
并传递你自己的在相同底层支持数据上的视图。请注意,这只是指定实际传输的底层缓冲区/内存支持的范围的另一种方法。与上面代码等效的 respondWithNewView
将是
const v = controller.byobRequest.view;
bytesRead = socket.readInto(v.buffer, v.byteOffset, v.byteLength);
const newView = new Uint8Array(v.buffer, v.byteOffset, bytesRead);
controller.byobRequest.respondWithNewView(newView);
规范
规范 |
---|
Streams 标准 # rs-byob-request-class |
浏览器兼容性
BCD 表只在浏览器中加载