ReadableStreamBYOBRequest
注意:此功能在 Web Workers 中可用。
ReadableStreamBYOBRequest 介面是 Streams API 的一部分,它表示一個“拉取請求”,用於從底層源獲取資料,並將以零複製(zero-copy)的方式傳輸給消費者(繞過流的內部佇列)。
當消費者請求資料且流的內部佇列為空時,會建立 ReadableStreamBYOBRequest 物件並進入“BYOB 模式”。(如果流已緩衝資料,則會直接解析消費者的請求)。底層位元組源可以透過其控制器的 ReadableByteStreamController.byobRequest 屬性訪問活動的 BYOB 請求,如果沒有待處理的請求,該屬性將設定為 null。
支援“BYOB 模式”的底層源應檢查 ReadableByteStreamController.byobRequest,如果存在,則必須使用它來傳輸資料。如果底層源在 ReadableByteStreamController.byobRequest 為 null 時收到資料,則可以使用 ReadableByteStreamController.enqueue() 將其入隊。當底層推送源在流的內部緩衝區不為空時收到新資料,可能會發生這種情況。
底層源透過向 BYOB 請求的 view 寫入資料,然後呼叫 respond() 來使用該請求,或者透過呼叫 respondWithNewView() 並將新檢視作為引數傳遞來使用。請注意,“新檢視”實際上必須是相同緩衝區的一個檢視,從相同的偏移量開始。這可能用於在底層源無法填充整個原始檢視時返回一個較短的緩衝區。
請注意,只有在 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 |
瀏覽器相容性
載入中…