ReadableStreamDefaultReader: метод read()
Примечание: Эта функция доступна в Потоках выполнения JavaScript.
Метод read() интерфейса ReadableStreamDefaultReader возвращает Promise, предоставляющий доступ к следующему фрагменту в внутренней очереди потока.
Синтаксис
read()
Параметры
Нет.
Возвращаемое значение
A Promise, который выполняется/отклоняется с результатом, зависящим от состояния потока. Возможные варианты:
- Если фрагмент доступен, promise выполняется с объектом в формате
{ value: theChunk, done: false }. - Если поток закрыт, promise выполняется с объектом в формате
{ value: undefined, done: true }. - Если поток содержит ошибку, promise отклоняется с соответствующей ошибкой.
Исключения
TypeError-
Объект-источник не является
ReadableStreamDefaultReader, у потока нет владельца или вызван методReadableStreamDefaultReader.releaseLock()(когда есть ожидающий запрос на чтение).
Примеры
Пример 1 - простой пример
Этот пример демонстрирует базовое использование API, но не пытается справиться со сложностями, такими как фрагменты потока, которые не заканчиваются на границах строк, например.
В этом примере, stream — это ранее созданный пользовательский ReadableStream. Он читается с помощью ReadableStreamDefaultReader, созданного с помощью getReader(). (см. наш пример простого случайного потока для полного кода). Каждый фрагмент читается последовательно и выводится на пользовательский интерфейс как массив байтов UTF-8, пока поток не будет полностью прочитан, в этот момент рекурсивная функция завершается, и весь поток выводится в другую часть пользовательского интерфейса.
function fetchStream() {
const reader = stream.getReader();
let charsReceived = 0;
// read() returns a promise that fulfills
// when a value has been received
reader.read().then(function processText({ done, value }) {
// Result objects contain two properties:
// done - true if the stream has already given you all its data.
// value - some data. Always undefined when done is true.
if (done) {
console.log("Stream complete");
para.textContent = result;
return;
}
// value for fetch streams is a Uint8Array
charsReceived += value.length;
const chunk = value;
let listItem = document.createElement("li");
listItem.textContent = `Received ${charsReceived} characters so far. Current chunk = ${chunk}`;
list2.appendChild(listItem);
result += chunk;
// Read some more, and call this function again
return reader.read().then(processText);
});
}
Пример 2 - обработка текста строка за строкой
Этот пример показывает, как можно загрузить текстовый файл и обработать его как поток текстовых строк. Он обрабатывает фрагменты потока, которые не заканчиваются на границах строк, и конвертирует их из Uint8Array в строки.
async function* makeTextFileLineIterator(fileURL) {
const utf8Decoder = new TextDecoder("utf-8");
let response = await fetch(fileURL);
let reader = response.body.getReader();
let { value: chunk, done: readerDone } = await reader.read();
chunk = chunk ? utf8Decoder.decode(chunk, { stream: true }) : "";
let re = /\r\n|\n|\r/gm;
let startIndex = 0;
for (;;) {
let result = re.exec(chunk);
if (!result) {
if (readerDone) {
break;
}
let remainder = chunk.substr(startIndex);
({ value: chunk, done: readerDone } = await reader.read());
chunk =
remainder + (chunk ? utf8Decoder.decode(chunk, { stream: true }) : "");
startIndex = re.lastIndex = 0;
continue;
}
yield chunk.substring(startIndex, result.index);
startIndex = re.lastIndex;
}
if (startIndex < chunk.length) {
// last line didn't end in a newline char
yield chunk.substr(startIndex);
}
}
for await (let line of makeTextFileLineIterator(urlOfFile)) {
processLine(line);
}
Спецификации
| Спецификация |
|---|
| Потоки # ref-for-default-reader-read① |
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari в iOS | Samsung Internet | WebView Android | |
read |
43 | 79 | 65 | 30 | 10 | 43 | 65 | 30 | 10 | 4.0 | 43 |
См. также
© 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/ReadableStreamDefaultReader/read