API потоков
Примечание: Эта функция доступна в Web Workers.
API потоков позволяет JavaScript программно получать потоки данных, полученные по сети, и обрабатывать их по желанию разработчика.
Концепции и использование
Потоковая передача данных подразумевает разделение ресурса, который необходимо получить по сети, на небольшие фрагменты и обработку их по частям. Браузеры уже делают это при получении медиа-активов — видео буферизуются и воспроизводятся по мере загрузки содержимого, а иногда изображения отображаются постепенно по мере загрузки большего объёма.
Но эта возможность никогда ранее не была доступна JavaScript. Ранее, если нам нужно было обработать какой-либо ресурс (видео, текстовый файл и т. д.), нам приходилось загружать весь файл, ожидать его десериализации в подходящий формат, а затем обрабатывать все данные.
С API потоков вы можете начать обработку сырых данных с помощью JavaScript по частям, как только они станут доступны, без необходимости создания буфера, строки или объекта blob.
Есть и другие преимущества — вы можете определять, когда потоки начинаются или заканчиваются, объединять потоки, обрабатывать ошибки и отменять потоки по мере необходимости, а также реагировать на скорость чтения потока.
Использование потоков зависит от того, как ответы доступны в виде потоков. Например, тело ответа, возвращённое успешным запросом fetch, является ReadableStream, который может быть прочитан с помощью читателя, созданного с помощью ReadableStream.getReader().
Более сложные использования включают создание собственного потока с использованием конструктора ReadableStream(), например, для обработки данных внутри service worker.
Вы также можете записывать данные в потоки с помощью WritableStream.
Примечание: Более подробную информацию о теории и практике потоков можно найти в наших статьях — Концепции API потоков, Использование потоков чтения, Использование потоков чтения байтовых данных и Использование потоков записи.
Интерфейсы потоков
Потоки чтения
ReadableStream-
Представляет поток данных для чтения. Он может использоваться для обработки потоков ответов Fetch API или потоков, определённых разработчиком (например, пользовательского конструктора
ReadableStream()). ReadableStreamDefaultReader-
Представляет стандартный читатель, который может использоваться для чтения данных потока, полученных по сети (например, по запросу fetch).
ReadableStreamDefaultController-
Представляет контроллер, позволяющий управлять состоянием и внутренней очередью
ReadableStream. Стандартные контроллеры предназначены для потоков, которые не являются потоками байтов.
Потоки записи
WritableStream-
Предоставляет стандартную абстракцию для записи данных потока в пункт назначения, известный как сток. Этот объект имеет встроенную механику обратной связи и очереди.
WritableStreamDefaultWriter-
Представляет стандартный записывающий объект потока, который можно использовать для записи фрагментов данных в поток для записи.
WritableStreamDefaultController-
Представляет контроллер, позволяющий управлять состоянием
WritableStream. При построенииWritableStream, базовому стоку предоставляется соответствующий экземплярWritableStreamDefaultControllerдля управления.
Потоки преобразования
TransformStream-
Представляет абстракцию объекта потока, преобразующего данные по мере их прохождения через цепочку объектов потока цепочки соединений.
TransformStreamDefaultController-
Предоставляет методы для управления
ReadableStreamиWritableStream, связанными с потоком преобразования.
Связанные API и операции с потоками
ByteLengthQueuingStrategy-
Предоставляет встроенную стратегию очереди по длине байтов, которая может использоваться при создании потоков.
CountQueuingStrategy-
Предоставляет встроенную стратегию очереди по количеству фрагментов, которая может использоваться при создании потоков.
Расширения для других API
Request-
При создании нового объекта
Request, вы можете передать емуReadableStreamв свойствоbodyего словаряRequestInit. Затем этотRequestможно передать вfetch()для начала загрузки потока. Response.body-
Тело ответа, возвращённое успешным запросом fetch, по умолчанию представлено как
ReadableStreamи к нему можно подключить читатель и т. д.
Интерфейсы, связанные с потоками байтов
ReadableStreamBYOBReader-
Представляет читатель BYOB ("принесите свой буфер"), который может использоваться для чтения данных потока, предоставленных разработчиком (например, пользовательского конструктора
ReadableStream()). ReadableByteStreamController-
Представляет контроллер, позволяющий управлять состоянием
ReadableStreamи внутренней очередью. Контроллеры потоков байтов предназначены для потоков байтов. ReadableStreamBYOBRequest-
Представляет запрос подтягивания в
ReadableByteStreamController.
Примеры
Мы создали каталог примеров, которые соответствуют документации API потоков — см. mdn/dom-examples/streams. Примеры следующие:
- Простой насос для потоков: Этот пример показывает, как потреблять ReadableStream и передавать его данные другому.
- Преобразование PNG в оттенки серого: Этот пример показывает, как ReadableStream PNG можно преобразовать в оттенки серого.
- Простой случайный поток: Этот пример показывает, как использовать пользовательский поток для генерации случайных строк, их вставки в очередь как фрагменты и их последующее считывание.
- Простой пример tee: Этот пример расширяет пример Простого случайного потока, демонстрируя, как поток можно разделить и прочитать оба результирующих потока независимо.
- Простой записывающий объект: Этот пример показывает, как записывать в поток для записи, затем декодировать поток и записывать содержимое на пользовательский интерфейс.
-
Распаковка фрагментов PNG: Этот пример показывает, как
pipeThrough()может использоваться для преобразования ReadableStream в поток других типов данных путём преобразования данных файла PNG в поток фрагментов PNG.
Примеры от других разработчиков:
Спецификации
| Спецификация |
|---|
| Потоки # rs-class |
| Потоки # ws-class |
Совместимость с браузерами
| Настольный | Мобильный | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari на IOS | Samsung Internet | WebView Android | |
WritableStream |
59 | 16 | 100 | 47 | 14.1 | 59 | 100 | 44 | 14.5 | 7.0 | 59 |
Streams_API |
59 | 16 | 100 | 47 | 14.1 | 59 | 100 | 44 | 14.5 | 7.0 | 59 |
abort |
59 | 16 | 100 | 47 | 14.1 | 59 | 100 | 44 | 14.5 | 7.0 | 59 |
close |
81 | 81 | 100 | 68 | 14.1 | 81 | 100 | 58 | 14.5 | 13.0 | 81 |
getWriter |
59 | 16 | 100 | 47 | 14.1 | 59 | 100 | 44 | 14.5 | 7.0 | 59 |
locked |
59 | 16 | 100 | 47 | 14.1 | 59 | 100 | 44 | 14.5 | 7.0 | 59 |
transferable |
87 | 87 | 103 | 73 | No | 87 | 103 | 62 | No | 14.0 | 87 |
| Настольный | Мобильный | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari на IOS | Samsung Internet | WebView Android | |
@@asyncIterator |
124 | 124 | 110 | 110 | No | 124 | 110 | 82 | No | 27.0 | 124 |
ReadableStream |
52 | 79 | 65 | 39 | 10.1 | 52 | 65 | 41 | 10.3 | 6.0 | 52 |
Streams_API |
43 | 14 | 65 | 30 | 10.1 | 43 | 65 | 30 | 10.3 | 4.0 | 43 |
cancel |
43 | 14 | 65 | 30 | 10.1 | 43 | 65 | 30 | 10.3 | 4.0 | 43 |
from_static |
No | No | 117 | No | No | No | 117 | No | No | No | No |
getReader |
43 | 14 | 65 | 30 | 10.1 | 43 | 65 | 30 | 10.3 | 4.0 | 43 |
locked |
52 | 14 | 65 | 39 | 10.1 | 52 | 65 | 41 | 10.3 | 6.0 | 52 |
pipeThrough |
59 | 79 | 102 | 46 | 10.1 | 59 | 102 | 43 | 10.3 | 7.0 | 59 |
pipeTo |
59 | 79 | 100 | 46 | 10.1 | 59 | 100 | 43 | 10.3 | 7.0 | 59 |
tee |
52 | 79 | 65 | 39 | 10.1 | 52 | 65 | 41 | 10.3 | 6.0 | 52 |
transferable |
87 | 87 | 103 | 73 | No | 87 | 103 | 62 | No | 14.0 | 87 |
values |
124 | 124 | 110 | 110 | No | 124 | 110 | 82 | No | 27.0 | 124 |
api.ReadableStream
Таблицы BCD загружаются только в браузере
api.WritableStream
Таблицы BCD загружаются только в браузере
См. также
© 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/Streams_API