ReadableStream
Примечание: Эта функция доступна в Web Workers.
Интерфейс ReadableStream из API потоков Streams API представляет собой поток для чтения байтовых данных. API Fetch API предоставляет конкретный экземпляр ReadableStream через свойство body объекта Response.
ReadableStream — это передаваемый объект.
Конструктор
ReadableStream()-
Создаёт и возвращает объект потока для чтения из предоставленных обработчиков.
Свойства экземпляра
-
ReadableStream.lockedТолько для чтения -
Возвращает булевое значение, указывающее, заблокирован ли поток для чтения.
Статические методы
-
ReadableStream.from()Экспериментальная -
Возвращает
ReadableStreamиз предоставленного итерируемого или асинхронного итерируемого объекта, например, массива, множества, асинхронного генератора и так далее.
Методы экземпляра
ReadableStream.cancel()-
Возвращает
Promise, который разрешается, когда поток отменяется. Вызов этого метода сигнализирует об утрате интереса потребителя к потоку. Предоставленный аргументreasonбудет передан в исходный источник, который может или не может его использовать. ReadableStream.getReader()-
Создаёт чтец и блокирует поток для него. Пока поток заблокирован, другой чтец не может быть получен, пока этот не будет освобожден.
ReadableStream.pipeThrough()-
Предоставляет цепкий способ передачи текущего потока через поток преобразования или любую другую пару потоков для записи/чтения.
ReadableStream.pipeTo()-
Передает текущий поток ReadableStream заданному
WritableStreamи возвращаетPromise, который выполняется при успешном завершении процесса передачи, или отклоняется, если возникли какие-либо ошибки. ReadableStream.tee()-
Метод
teeразветвляет этот поток для чтения, возвращая массив из двух элементов, содержащий две полученные ветви как новые экземплярыReadableStream. Каждый из этих потоков получает те же входные данные.
Асинхронная итерация
ReadableStream реализует протокол асинхронной итерируемости. Это позволяет выполнить асинхронную итерацию по частям в потоке с помощью синтаксиса for await...of:
const stream = new ReadableStream(getSomeSource());
for await (const chunk of stream) {
// Do something with each 'chunk'
}
Асинхронный итератор потребляет поток, пока не закончится данные или не произойдёт другое завершение. Цикл также может завершиться досрочно из-за break, throw, или return инструкции.
Во время итерации поток блокируется, чтобы предотвратить получение читателя другими потребителями (попытка итерации по уже заблокированному потоку вызовет TypeError). Эта блокировка снимается при выходе из цикла.
По умолчанию выход из цикла также отменяет поток, так что он больше не может использоваться. Чтобы продолжить использование потока после выхода из цикла, передайте { preventCancel: true } в метод values() потока:
for await (const chunk of stream.values({ preventCancel: true })) {
// Do something with 'chunk'
break;
}
// Acquire a reader for the stream and continue reading ...
Примеры
Поток Fetch
В следующем примере создаётся искусственный Response для потоковой передачи фрагментов HTML, полученных из другого ресурса в браузер.
Он демонстрирует использование ReadableStream в сочетании с Uint8Array.
fetch("https://www.example.org")
.then((response) => response.body)
.then((rb) => {
const reader = rb.getReader();
return new ReadableStream({
start(controller) {
// The following function handles each data chunk
function push() {
// "done" is a Boolean and value a "Uint8Array"
reader.read().then(({ done, value }) => {
// If there is no more data to read
if (done) {
console.log("done", done);
controller.close();
return;
}
// Get the data and send it to the browser via the controller
controller.enqueue(value);
// Check chunks by logging to the console
console.log(done, value);
push();
});
}
push();
},
});
})
.then((stream) =>
// Respond with our stream
new Response(stream, { headers: { "Content-Type": "text/html" } }).text(),
)
.then((result) => {
// Do things with result
console.log(result);
});
Преобразование итератора или асинхронного итератора в поток
Статический метод from() может преобразовать итератор, например, Array или Map, или (асинхронный) итератор в поток для чтения:
const myReadableStream = ReadableStream.from(iteratorOrAsyncIterator);
В браузерах, не поддерживающих метод from(), можно вместо этого создать собственный настраиваемый поток для чтения для достижения того же результата:
function iteratorToStream(iterator) {
return new ReadableStream({
async pull(controller) {
const { value, done } = await iterator.next();
if (value) {
controller.enqueue(value);
}
if (done) {
controller.close();
}
},
});
}
Предупреждение: Этот пример предполагает, что возвращаемое значение (value когда done — true), если оно есть, также является частью, подлежащей очереди. Некоторые API итераторов могут использовать возвращаемое значение для других целей. Возможно, потребуется внести коррективы в код в зависимости от используемого API.
Асинхронная итерация потока с использованием for await...of
В этом примере показано, как обработать ответ fetch() с помощью цикла for await...of для итерации по поступающим частям.
const response = await fetch("https://www.example.org");
let total = 0;
// Iterate response.body (a ReadableStream) asynchronously
for await (const chunk of response.body) {
// Do something with each chunk
// Here we just accumulate the size of the response.
total += chunk.length;
}
// Do something with the total
console.log(total);
Спецификации
| Спецификация |
|---|
| Потоки # rs-class |
Совместимость с браузерами
| Рабочий стол | Мобильное устройство | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на IOS | Samsung Internet | WebView Android | |
@@asyncIterator |
124 | 124 | 110 | 110 | Нет | 124 | 110 | 82 | Нет | 27.0 | 124 |
ReadableStream |
52 | 79 | 65 | 39 | 10.1 | 52 | 65 | 41 | 10.3 | 6.0 | 52 |
ReadableStream |
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 |
Нет | Нет | 117 | Нет | Нет | Нет | 117 | Нет | Нет | Нет | Нет |
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 | Нет | 87 | 103 | 62 | Нет | 14.0 | 87 |
values |
124 | 124 | 110 | 110 | Нет | 124 | 110 | 82 | Нет | 27.0 | 124 |
См. также
- Концепции API потоков
- Использование потоков для чтения
- Использование потоков для чтения байтов
- Визуализатор потоков WHATWG, для базовой визуализации потоков для чтения, записи и преобразования.
- Web-streams-polyfill или sd-streams - полифилы
© 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/ReadableStream