ReadableStreamBYOBReader: read()-Methode

Limited availability

This feature is not Baseline because it does not work in some of the most widely-used browsers.

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

Die read() Methode des ReadableStreamBYOBReader-Interfaces wird verwendet, um Daten in eine Ansicht auf einem vom Benutzer bereitgestellten Puffer aus einem zugehörigen lesbaren Byte-Stream zu lesen. Eine Anforderung für Daten wird aus den internen Warteschlangen des Streams erfüllt, wenn dort Daten vorhanden sind. Wenn die Stream-Warteschlangen leer sind, kann die Anforderung als Zero-Copy-Übertragung aus der zugrunde liegenden Byte-Quelle bereitgestellt werden.

Die Methode nimmt als Argument eine Ansicht auf einen Puffer, 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 einen Fehler aufweist, wird das Promise mit dem entsprechenden Fehlerobjekt abgelehnt.

Wenn ein Datenblock bereitgestellt wird, enthält die Eigenschaft value eine neue Ansicht. Dies wird eine Ansicht über denselben Puffer/oder denselben Speicher (und vom gleichen Typ) wie die ursprünglich an die read()-Methode übergebene view sein, die jetzt mit dem neuen Datenblock gefüllt ist. Beachten Sie, dass die ursprüngliche an die Methode übergebene view nach Erfüllung des Promises abgetrennt und nicht mehr verwendbar ist. Das Promise wird mit einem value: undefined erfüllt, wenn der Stream abgebrochen wurde. In diesem Fall wird der zugrunde liegende Speicherbereich von view verworfen und nicht an den Aufrufer zurückgegeben (alle zuvor gelesenen Daten im Puffer der Ansicht gehen verloren).

Die done-Eigenschaft zeigt an, ob noch weitere Daten erwartet werden. Der Wert ist true, wenn der Stream geschlossen oder abgebrochen wird, und false andernfalls.

Die Methode hat auch ein optionales options.min-Argument, das verwendet werden kann, um die Mindestanzahl von Elementen anzugeben, die verfügbar sein müssen, bevor das Promise während der Aktivität des Streams erfüllt wird. Die in der value-Eigenschaft zurückgegebene Ansicht wird immer mindestens diese Anzahl von Elementen haben, es sei denn, der Stream ist geschlossen.

Syntax

js
read(view)
read(view, options)

Parameter

view

Die Ansicht, in die die Daten gelesen werden sollen.

options Optional

Optionen sind wie folgt:

min

Die minimale Anzahl von Elementen, die gelesen werden müssen, bevor das Promise während der Aktivität des 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 sein als die Ansicht, in die gelesen wird.

Rückgabewert

Ein Promise, das abhängig vom Zustand des Streams ein Ergebnis erfüllt/ablehnt. Das Ergebnisobjekt enthält zwei Eigenschaften: value und done.

Die folgenden Möglichkeiten sind gegeben:

  • 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 Speicher wie die an die read()-Methode übergebene view. Die ursprüngliche view wird abgetrennt und ist nicht mehr verwendbar.

  • 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 zugrunde liegende Speicher verworfen.

  • Wenn der Stream einen Fehler auswirft, wird das Promise mit dem entsprechenden Fehler abgelehnt.

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 es eine ausstehende Leseanforderung gibt).

RangeError

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

Beispiele

Lesen in eine Ansicht

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

Zuerst erstellen wir den Reader mit ReadableStream.getReader() auf dem Stream und geben mode: "byob" im Optionsparameter an. Wir müssen auch ein ArrayBuffer erstellen, das der "zugrunde liegende Speicher" der Ansichten ist, in die wir schreiben werden.

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

Eine Funktion, die den Reader verwendet, wird unten gezeigt. 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 Array-Puffers ist, der noch nicht beschrieben wurde. Die Parameter der Ansicht werden aus den Daten berechnet, die in früheren Aufrufen empfangen wurden, die einen Offset in den ursprünglichen Array-Puffer 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 Daten mehr im Stream vorhanden sind, erfüllt die read()-Methode mit einem Objekt, dessen Eigenschaft done auf true gesetzt ist, und die Funktion gibt zurück.

Lesen einer Mindestanzahl von Elementen

Dieses Beispiel ist fast genau dasselbe wie das vorherige, außer dass wir den Code modifiziert 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. Weitere Informationen finden Sie unter 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

Die Protokollierung der zugrunde liegenden Push-Quelle (links) und des Konsumenten (rechts) wird unten gezeigt. Beachten Sie, dass, wenn der Browser das options.min-Argument unterstützt, mindestens 101 Elemente jedes Mal zurückgegeben werden (und oft mehr), außer wenn der Stream geschlossen wird.

Spezifikationen

Specification
Streams
# ref-for-byob-reader-read③

Browser-Kompatibilität

Siehe auch