Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

ReadableStreamBYOBReader: read()-Methode

Baseline 2026
Neu verfügbar
*

Seit März 2026 funktioniert diese Funktion auf aktuellen Geräten und in aktuellen Browserversionen. Auf älteren Geräten oder in älteren Browsern funktioniert sie möglicherweise nicht.

* Einige Teile dieser Funktion werden möglicherweise unterschiedlich gut unterstützt.

Hinweis: Diese Funktion ist in Web Workers verfügbar.

Die read()-Methode des ReadableStreamBYOBReader-Interfaces wird verwendet, um Daten in eine Ansicht eines benutzerbereitgestellten Puffers aus einem zugeordneten lesbaren Bytestrom zu lesen. Eine Datenanfrage wird von den internen Warteschlangen des Streams erfüllt, wenn Daten vorhanden sind. Sind die Stream-Warteschlangen leer, kann die Anfrage als Zero-Copy-Transfer von der zugrunde liegenden Bytequelle bereitgestellt werden.

Die Methode nimmt als Argument eine Ansicht eines Puffers, in den die bereitgestellten Daten gelesen werden sollen, und gibt ein Promise zurück. Das Promise wird mit einem Objekt erfüllt, das die Eigenschaften value und done enthält, wenn Daten verfügbar werden oder wenn der Stream abgebrochen wird. Wenn der Stream fehlerhaft ist, wird das Promise mit dem entsprechenden Fehlerobjekt abgelehnt.

Wenn ein Datenblock bereitgestellt wird, enthält die value-Eigenschaft eine neue Ansicht. Dies wird eine Ansicht über denselben Puffer/Basis-Speicher (und vom selben Typ) sein wie die ursprüngliche view, die an die read()-Methode übergeben wurde und nun mit dem neuen Datenblock gefüllt ist. Beachten Sie, dass die ursprüngliche view, die an die Methode übergeben wurde, einmal die Zusage erfüllt wird, abgetrennt und nicht mehr nutzbar ist. Das Promise wird mit einem value: undefined erfüllt, wenn der Stream abgebrochen wurde. In diesem Fall wird der Basisspeicherbereich von view verworfen und nicht an den Anrufer zurückgegeben (alle zuvor gelesenen Daten im Puffer der Ansicht gehen verloren).

Die done-Eigenschaft gibt an, ob noch mehr Daten erwartet werden. Der Wert wird auf true gesetzt, wenn der Stream geschlossen oder abgebrochen ist, und auf false in anderen Fällen.

Die Methode hat auch ein optionales options.min-Argument, das verwendet werden kann, um die minimale Anzahl von Elementen anzugeben, die verfügbar sein müssen, bevor das Promise während des aktiven Streams erfüllt wird. Die in der value-Eigenschaft zurückgegebene Ansicht enthält immer mindestens diese Anzahl von Elementen, außer wenn der Stream geschlossen ist.

Syntax

js
read(view)
read(view, options)

Parameter

view

Die Ansicht, in die die Daten gelesen werden sollen.

options Optional

Die Optionen sind wie folgt:

min

Die minimale Anzahl von Elementen, die gelesen werden müssen, bevor das Promise während des aktiven Streams erfüllt wird. Wenn nicht angegeben, wird das Promise mit mindestens einem Element bis zur maximalen Größe der Ansicht aufgelöst. Diese Zahl darf nicht größer als die Ansicht sein, in die gelesen wird.

Rückgabewert

Ein Promise, das sich je nach Zustand des Streams mit einem Ergebnis erfüllt/abgelehnt wird. Das Ergebnisobjekt enthält zwei Eigenschaften, value und done.

Folgendes ist möglich:

  • Wenn ein Datenblock verfügbar ist und der Stream noch aktiv ist, ist done des Ergebnisses false, und value ist eine Ansicht, die die neuen Daten enthält. Dies ist eine Ansicht desselben Typs und über denselben Basisspeicher wie die view, die an die read()-Methode übergeben wurde. Die ursprüngliche view wird abgetrennt und nicht mehr nutzbar sein.

  • Wenn der Stream geschlossen ist, ist done des Ergebnisses true, und value hat dieselben Eigenschaften wie oben.

  • Wenn der Stream abgebrochen ist, ist done des Ergebnisses true, und value ist undefined. In diesem Fall wird der Basisspeicher verworfen.

  • Wenn der Stream einen Fehler auslöst, lehnt das Promise mit dem entsprechenden Fehler ab.

Ausnahmen

TypeError

Das Quellobjekt ist kein ReadableStreamBYOBReader, der Stream hat keinen Besitzer, die Ansicht ist kein Objekt oder wurde getrennt, die Länge der Ansicht ist 0, options.min ist 0, oder ReadableStreamBYOBReader.releaseLock() wird aufgerufen (wenn eine ausstehende Leseanforderung vorliegt).

RangeError

Der Wert von options.min ist größer als die Ansicht, in die geschrieben wird.

Beispiele

Lesen in eine Ansicht

Der hier gezeigte Beispielcode stammt aus den Live-Beispielen unter Using readable byte streams.

Zuerst erstellen wir den Leser mit ReadableStream.getReader() aus dem Stream, wobei mode: "byob" in den Optionen angegeben wird. Wir müssen auch ein ArrayBuffer erstellen, das der "Basis-Speicher" der Ansichten ist, in die wir schreiben werden.

js
const reader = stream.getReader({ mode: "byob" });
let buffer = new ArrayBuffer(4000);

Unten ist eine Funktion gezeigt, die den Leser verwendet. Diese ruft rekursiv die read()-Methode auf, um Daten in den Puffer zu lesen. Die Methode nimmt ein Uint8Array typisiertes Array, das eine Ansicht über den Teil des ursprünglichen ArrayBuffers ist, der noch nicht beschrieben wurde. Die Parameter der Ansicht werden aus den in früheren Aufrufen empfangenen Daten berechnet, die einen Versatz in den ursprünglichen ArrayBuffer definieren.

js
readStream(reader);

function readStream(reader) {
  let bytesReceived = 0;
  let offset = 0;

  while (offset < buffer.byteLength) {
    // read() returns a promise that fulfills when a value has been received
    reader
      .read(new Uint8Array(buffer, offset, buffer.byteLength - offset))
      .then(function processBytes({ done, value }) {
        // Result objects contain two properties:
        // done  - true if the stream has already given all its data.
        // value - some data. 'undefined' if the reader is canceled.

        if (done) {
          // There is no more data in the stream
          return;
        }

        buffer = value.buffer;
        offset += value.byteLength;
        bytesReceived += value.byteLength;

        // Read some more, and call this function again
        // Note that here we create a new view over the original buffer.
        return reader
          .read(new Uint8Array(buffer, offset, buffer.byteLength - offset))
          .then(processBytes);
      });
  }
}

Wenn keine weiteren Daten im Stream vorhanden sind, wird die read()-Methode mit einem Objekt erfüllt, das die Eigenschaft done auf true gesetzt hat und die Funktion wird beendet.

Lesen einer minimalen Anzahl von Elementen

Dieses Beispiel ist fast genauso wie das vorherige, außer dass wir den Code geändert haben, um bei jeder Iteration mindestens 101 Elemente zu lesen.

Wir haben es auch in ein Live-Beispiel umgewandelt. Beachten Sie, dass der größte Teil des Codes für das Beispiel nicht relevant ist und daher ausgeblendet ist. Für weitere Informationen siehe Using readable byte streams.

JavaScript

js
function readStream(reader) {
  let bytesReceived = 0;
  let offset = 0;

  while (offset < buffer.byteLength) {
    // read() returns a promise that resolves when a value has been received
    reader
      .read(new Uint8Array(buffer, offset, buffer.byteLength - offset), {
        min: 101,
      })
      .then(async function processText({ done, value }) {
        // Result objects contain two properties:
        // done  - true if the stream has already given all its data.
        // value - some data. Always undefined when done is true.

        if (done) {
          logConsumer(
            `readStream() complete. Read ${value.byteLength} bytes (total: ${bytesReceived})`,
          );
          return;
        }

        buffer = value.buffer;
        offset += value.byteLength;
        bytesReceived += value.byteLength;

        // logConsumer(`Read ${bytesReceived} bytes: ${value}`);
        logConsumer(`Read ${value.byteLength} bytes (total: ${bytesReceived})`);
        result += value;

        // Read some more, and call this function again
        return reader
          .read(new Uint8Array(buffer, offset, buffer.byteLength - offset), {
            min: 101,
          })
          .then(processText);
      });
  }
}

Ergebnis

Das Logging von der zugrunde liegenden Push-Quelle (links) und Verbraucher (rechts) wird unten angezeigt. Beachten Sie, dass, wenn der Browser das options.min-Argument unterstützt, bei jeder Iteration mindestens 101 Elemente zurückgegeben werden (und oft mehr), außer wenn der Stream geschlossen wird.

Spezifikationen

Spezifikation
Streams
# byob-reader-read

Browser-Kompatibilität

Siehe auch