Spec-Zone.ru › Web APIs

Поток чтения: метод tee()

Примечание: Эта функция доступна в Потоках Web Workers.

Метод tee() интерфейса ReadableStream расщепляет текущий поток чтения, возвращая массив из двух элементов, содержащих две ветви результата в виде новых экземпляров ReadableStream.

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

Ветвление потока будет частично сигнализировать о недостатке ресурсов со скоростью более быстрого потребителя из двух ReadableStream ветвей, а необработанные данные добавляются в очередь внутри более медленного потребителя ReadableStream без каких-либо ограничений или недостатка ресурсов. То есть, когда у обеих ветвей есть непрочитанный элемент в их внутренней очереди, тогда внутренняя очередь контроллера исходного ReadableStream начнёт заполняться, и как только её desiredSize ≤ 0 или контроллер потока байтов desiredSize ≤ 0, контроллер прекратит вызывать pull(controller) на базовом источнике, переданном в ReadableStream(). Если потребляется только одна ветвь, всё содержимое будет добавлено в память. Поэтому не следует использовать встроенный tee() для одновременного чтения очень больших потоков с разной скоростью. Вместо этого следует искать реализацию, которая полностью учитывает ограничение ресурсов, соответствующее скорости более медленной ветви потребления.

Чтобы отменить поток, вам нужно отменить обе полученные ветви. Расщепление потока обычно блокирует его на всё время существования, предотвращая блокировку другими читателями.

Синтаксис

tee()

Параметры

Нет.

Возвращаемое значение

Массив Array , содержащий два экземпляра ReadableStream.

Исключения

TypeError

Выбрасывается, если исходный поток не является потоком ReadableStream.

Примеры

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

function teeStream() {
  const teedOff = stream.tee();
  fetchStream(teedOff[0], list2);
  fetchStream(teedOff[1], list3);
}

function fetchStream(stream, list) {
  const reader = stream.getReader();
  let charsReceived = 0;

  // read() returns a promise that resolves
  // 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");
      return;
    }

    // value for fetch streams is a Uint8Array
    charsReceived += value.length;
    const chunk = value;
    let listItem = document.createElement("li");
    listItem.textContent = `Read ${charsReceived} characters so far. Current chunk = ${chunk}`;
    list.appendChild(listItem);

    // Read some more, and call this function again
    return reader.read().then(processText);
  });
}

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

Спецификация
Потоки
# ref-for-rs-tee②

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

Рабочие столы Мобильные
Chrome Edge Firefox Opera Safari Chrome Android Firefox для Android Opera Android Safari на IOS Samsung Internet WebView Android
tee 52 79 65 39 10.1 52 65 41 10.3 6.0 52

См. также

  • ReadableStream() конструктор
  • Ветвление потока

© 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/tee

Spec-Zone.ru

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