--- title: Streams API slug: Web/API/Streams_API translation_of: Web/API/Streams_API ---
{{SeeCompatTable}}{{APIRef("Streams")}}

Streams API (API обработки потоков) позволяет программно получить доступ с помощью JavaScript к полученным по сети потокам данных и обработать их по желанию разработчика.

Концепция и использование

Потоковая передача данных предполагает разбивку ресурса, который вы хотите получить через сеть, на мелкие кусочки и затем их обработку часть за частью. Это то, что браузеры делают в любом случае получения ассетов, чтобы показать их на страницах — видео буфер и другие ресурсы доступные для воспроизведения, и иногда это заметно на изображениях, загружающихся частями.

Но методы работы с этим и данные никогда прежде не были доступны для JavaScript. Раньше, если мы хотели обработать часть ресурса, нам всё равно пришлось бы загрузить весь файл (будь то видео, текстовый файл и т.п.), мы были бы обязаны скачать файл целиком, дождаться пока он будет приведён к необходимому формату и только потом работать с файлом после его полной загрузки.

С помощью потоков доступных в JavaScript меняется все — вы можете начать обрабатывать данные бит за битом как только данные появляются на стороне клиента, без необходимости генерировать буфер, строку или какой либо объект из потока.

Но это не все преимущества — вы можете отловить процессы старта и завершения потока, связывать потоки в цепочки, обрабатывать ошибки или прерывать их если это необходимо, реагировать на скорость с которой поток считывается.

Основное использование потоков крутиться вокруг создания ответов доступными в виде потоков. Например, тело ответа {{domxref("Body")}} возвращённого успешным fetch запросом может быть представлено как {{domxref("ReadableStream")}}, и вы можете прочитать его используя ридер полученный методом {{domxref("ReadableStream.getReader()")}}, отменить его с помощью {{domxref("ReadableStream.cancel()")}}, и тп.

Более сложные примеры задействуют создание ваших собственных  потоков с помощью конструктора {{domxref("ReadableStream.ReadableStream", "ReadableStream()")}}, например чтобы обработать данные внутри service worker.

Вы также можете записывать данные в потоки используя {{domxref("WritableStream")}}.

Примечание: вы можете найти больше информации о теории и практике использования потоков в следующих статьях — Концепты API потоков , Использование потоков на чтение, и Использование потоков на запись.

Интерфейсы

Потоки чтения данных

{{domxref("ReadableStream")}}
Представляет собой считываемый поток данных. Он может быть использован чтобы обработать потоки ответов от Fetch API, или созданный разработчиком поток (например произвольный {{domxref("ReadableStream.ReadableStream", "ReadableStream()")}}).
{{domxref("ReadableStreamDefaultReader")}}
Представляет собой считывателя, который может быть использован чтобы считать данные поставляемые из сети (например fetch запрос).
{{domxref("ReadableStreamDefaultController")}}
Представляет собой контроллер позволяющий контролировать состояние {{domxref("ReadableStream")}} и очереди внутри него. Является контроллером по умолчанию для не байтовых потоков.

Writable streams

{{domxref("WritableStream")}}
Предоставляет стандартную абстракцию, известную как раковина, для записи потоков по месту назначения. Этот объект идёт вместе со встроенными методами контроля обратного потока и созданием очередей.
{{domxref("WritableStreamDefaultWriter")}}
Представляет запись потока по умолчанию, которая может использоваться для записи фрагментов данных в записываемый поток.
{{domxref("WritableStreamDefaultController")}}
Представляет собой контроллер состояния {{domxref("WritableStream")}}. При создании WritableStream, создаётся также соответствующий экземпляр WritableStreamDefaultController.

Дополнительные API и операции по работе с потоками

{{domxref("ByteLengthQueuingStrategy")}}
Предоставляет встроенную стратегию длины байт-очереди, которая может быть использована при построении потоков.
{{domxref("CountQueuingStrategy")}}
Предоставляет встроенную стратегию организации очередей подсчёта чанков, которая может использоваться при построении потоков.

Дополнения к другим API

{{domxref("Request")}}
При создании нового объекта типа Request, вы можете добавить {{domxref("ReadableStream")}} в свойство body его словаря RequestInit.  Этот объект типа Request может быть отправлен в  {{domxref("WindowOrWorkerGlobalScope.fetch()")}}, чтобы начать загрузку потока.
{{domxref("Body")}}
Ответ {{domxref("Body")}} возвращённый успешному fetch запросу вывешивается по умолчанию как {{domxref("ReadableStream")}}, и может иметь получателя прикреплённого к нему и тп.

Интерфейсы в дополнение к ByteStream

Важно: данные интерфейсы пока не реализованы, и были подняты вопросы о том, находятся ли детали спецификации в достаточно законченном состоянии для их реализации. Со временем это может измениться

{{domxref("ReadableStreamBYOBReader")}}
Represents a BYOB ("bring your own buffer") reader that can be used to read stream data supplied by the developer (e.g. a custom {{domxref("ReadableStream.ReadableStream", "ReadableStream()")}} constructor).
{{domxref("ReadableByteStreamController")}}
Контроллер позволяющий обрабатывать состояние {{domxref("ReadableStream")}} и внутреннюю очередь. Байтовые контроллеры для байтовых потоков.
{{domxref("ReadableStreamBYOBRequest")}}
Represents a pull into request in a {{domxref("ReadableByteStreamController")}}.

Примеры

Мы создали папку с примерами, которые идут вместе с документацией к API потоков — смотрите mdn/dom-examples/streams. Можно найти такие примеры как:

Примеры от других разработчиков:

Спецификации

Спецификация Статус Комментарий
{{SpecName('Streams')}} {{Spec2('Streams')}} Первоначальное определение.

Совместимость с браузерами

Поток записи данных

{{Compat("api.WritableStream")}}

Смотрите также