ReadableStreamBYOBRequest

注意:此功能在 Web Workers 中可用。

ReadableStreamBYOBRequestStreams API 的接口,表示对来自底层来源的数据的“拉取请求”,该请求将作为零拷贝传输到消费者(绕过流的内部队列)。

当消费者请求数据且流的内部队列为空时,ReadableStreamBYOBRequest 对象将在“BYOB 模式”下创建。(如果流已经缓冲了数据,则会直接解决消费者的请求。)底层字节源可以通过其控制器的 ReadableByteStreamController.byobRequest 属性访问活动 BYOB 请求,如果不存在未完成的请求,该属性将设置为 null

支持“BYOB 模式”的底层源应检查 ReadableByteStreamController.byobRequest,如果存在,必须使用它来传输数据。如果数据在 ReadableByteStreamController.byobRequestnull 时从底层源到达,则可以使用 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。拉取底层字节源如果未启用自动块分配并且与默认读取器一起使用,则只需要此检查。

js
if (controller.byobRequest) {
  /* code to transfer data */
}

有两种方法可以将数据读入 ReadableStreamBYOBRequest 然后传输它。第一种方法是将数据写入 ReadableStreamBYOBRequest.view 属性,然后调用 ReadableStreamBYOBRequest.respond() 以指示要传输的数据量。操作完成后,byobRequest.view 将被分离,并且请求应被丢弃。

以下代码展示了使用假设的 readInto() 方法将数据复制到视图中的情况

js
const v = controller.byobRequest.view;
bytesRead = socket.readInto(v.buffer, v.byteOffset, v.byteLength);
controller.byobRequest.respond(bytesRead);

另一种方法是调用 ReadableStreamBYOBRequest.respondWithNewView() 并传递你自己的在相同底层支持数据上的视图。请注意,这只是指定实际传输的底层缓冲区/内存支持的范围的另一种方法。与上面代码等效的 respondWithNewView 将是

js
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 表只在浏览器中加载

另请参阅