ReadableStreamBYOBRequest
Ограниченная доступность
Эта функция не является базовой, так как она не работает во всех широко используемых браузерах.
Примечание: Эта функция доступна в Web Workers.
Интерфейс ReadableStreamBYOBRequest API потоков представляет собой «запрос данных» из базового источника, который будет передан потребителю без копирования (миновать внутренние очереди потока).
ReadableStreamBYOBRequest объекты создаются в режиме «BYOB» (блокирующего ввода-вывода), когда потребитель запрашивает данные, а внутренняя очередь потока пуста. (Поток выполнит запрос потребителя напрямую, если у него уже есть буферизованные данные). Базовый байтовый источник может получить доступ к активным запросам BYOB через свойство контроллера ReadableByteStreamController.byobRequest, которое будет установлено в значение null в случае отсутствия открытых запросов.
Базовый источник, поддерживающий режим «BYOB», должен проверять наличие ReadableByteStreamController.byobRequest и использовать его для передачи данных, если он присутствует. Если данные поступают из базового источника, когда ReadableByteStreamController.byobRequest имеет значение null, они могут быть помещены в очередь с помощью ReadableByteStreamController.enqueue(). Это может произойти, когда базовый источник получает новые данные, когда внутренние буферы потока не пусты.
Базовый источник использует запрос, записывая данные в свойство запроса BYOB view, а затем вызывая respond(), или вызывая respondWithNewView() и передавая новый фрагмент в качестве аргумента. Обратите внимание, что «новый фрагмент» должен фактически быть фрагментом того же буфера, что и исходный view, начиная с того же смещения. Это может быть использовано для возврата более короткого буфера, если базовый источник не может заполнить весь исходный фрагмент.
Обратите внимание, что ReadableByteStreamController создается только для базовых источников, когда type="bytes" указано для источника в конструкторе ReadableStream(). Режим «BYOB» включён, когда либо autoAllocateChunkSize указано в конструкторе ReadableController(), либо используется ReadableStreamBYOBReader (обычно создаваемый вызовом ReadableStream.getReader() с аргументом { mode: 'byob' }).
Конструктор
Нет. Экземпляр ReadableStreamBYOBRequest создаётся автоматически ReadableByteStreamController по мере необходимости.
Свойства экземпляра
-
ReadableStreamBYOBRequest.viewТолько для чтения -
Возвращает текущий фрагмент. Это фрагмент буфера, который будет передан потребителю при вызове
ReadableStreamBYOBRequest.respond().
Методы экземпляра
ReadableStreamBYOBRequest.respond()-
Сигнализирует связанному потоку чтения байтов, что указанное количество байтов было записано в текущий
view, что приводит к выполнению ожидаемого запроса потребителя. Обратите внимание, что после вызова этого методаviewпередаётся и больше не может быть изменён. ReadableStreamBYOBRequest.respondWithNewView()-
Сигнализирует связанному потоку чтения байтов, что переданный в качестве аргумента фрагмент должен быть передан потребителю потока чтения байтов. Этот новый фрагмент должен использовать тот же буфер, что и исходный
view, начинаться с того же смещения и иметь такую же или меньшую длину. Обратите внимание, что после вызова этого методаviewпередаётся и больше не может быть изменён.
Примеры
Следующий код взят из примера на Использование потоков чтения байтов > Создание потока чтения байтов для сокета push.
Базовый источник на стороне «push», имеющий данные для передачи, должен сначала проверить, что controller.byobRequest не null. Базовый источник на стороне «pull» будет проверять это только в том случае, если не включена автоматическая выделение фрагментов и используется по умолчанию reader.
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);
Спецификации
| Спецификация |
|---|
| Потоки # rs-byob-request-class |
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
ReadableStreamBYOBRequest |
89 | 89 | 102 | 75 | Нет | 89 | 102 | 63 | Нет | 15.0 | 89 |
respond |
89 | 89 | 102 | 75 | Нет | 89 | 102 | 63 | Нет | 15.0 | 89 |
respondWithNewView |
89 | 89 | 102 | 75 | Нет | 89 | 102 | 63 | Нет | 15.0 | 89 |
view |
89 | 89 | 102 | 75 | Нет | 89 | 102 | 63 | Нет | 15.0 | 89 |
См. также
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamBYOBRequest