Spec-Zone.ru › Web APIs

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

См. также

  • ReadableStreamDefaultReader() конструктор
  • Использование потоков чтения

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API