Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.
Als JavaScript-Entwickler ist es sehr nützlich, programmatisch Daten in einen Stream zu schreiben! Dieser Artikel erklärt die Funktionalität beschreibbarer Streams der Streams API.
Hinweis: Dieser Artikel setzt voraus, dass Sie die Anwendungsfälle von beschreibbaren Streams verstehen und mit den grundlegenden Konzepten vertraut sind. Falls nicht, empfehlen wir Ihnen, zuerst den Überblick über Streams-Konzepte und deren Verwendung sowie den speziellen Artikel zu Streams API-Konzepten zu lesen und dann zurückzukehren.
Hinweis: Wenn Sie nach Informationen zu lesbaren Streams suchen, versuchen Sie Verwenden von lesbaren Streams und Verwenden von lesbaren Byte-Streams.
In unserem dom-examples/streams Repository finden Sie ein Einfaches Schreibbeispiel (sehen Sie es sich auch live an). Es nimmt eine gegebene Nachricht und schreibt sie in einen beschreibbaren Stream, wobei jeder Chunk auf der Benutzeroberfläche angezeigt wird, sobald er in den Stream geschrieben wird. Die gesamte Nachricht wird auf der Benutzeroberfläche angezeigt, wenn das Schreiben abgeschlossen ist.
Schauen wir uns an, wie die Funktionalität der beschreibbaren Streams in unserem Demo funktioniert.
Um einen beschreibbaren Stream zu erstellen, verwenden wir den WritableStream() Konstruktor; die Syntax sieht zunächst komplex aus, ist aber eigentlich gar nicht so schlimm.
Das Syntax-Skelett sieht so aus:
Der Konstruktor nimmt zwei Objekte als Parameter an. Das erste Objekt ist erforderlich und erstellt ein Modell in JavaScript des zugrunde liegenden Sinks, in das die Daten geschrieben werden. Das zweite Objekt ist optional und ermöglicht es Ihnen, eine benutzerdefinierte Warteschlangenstrategie für Ihren Stream zu spezifizieren, die in Form einer Instanz von ByteLengthQueuingStrategy oder CountQueuingStrategy erfolgt.
Das erste Objekt kann bis zu vier Mitglieder enthalten, die alle optional sind:
Der Konstruktoraufruf in unserem Beispiel sieht folgendermaßen aus:
Um tatsächlich Inhalt in den Stream zu schreiben, rufen wir die Funktion sendMessage() auf, indem wir ihr eine Nachricht übergeben, die geschrieben werden soll, und den Stream, in den geschrieben werden soll:
Die Definition von sendMessage() sieht folgendermaßen aus:
Hier erstellen wir einen Writer, um die Chunks in den Stream zu schreiben, indem wir WritableStream.getWriter() verwenden. Dies erstellt eine Instanz von WritableStreamDefaultWriter.
Wir erstellen auch eine neue Instanz von TextEncoder mit dem entsprechenden Konstruktor, um die Nachricht in Chunks zu kodieren, die in den Stream eingefügt werden.
Mit den kodierten Chunks rufen wir dann forEach() auf dem resultierenden Array auf. Innerhalb dieses Blocks verwenden wir WritableStreamDefaultWriter.ready, um zu überprüfen, ob der Writer bereit ist, einen weiteren Chunk geschrieben zu bekommen. ready gibt ein Versprechen zurück, das erfüllt wird, wenn dies der Fall ist, innerhalb dessen wir WritableStreamDefaultWriter.write() aufrufen, um den Chunk tatsächlich in den Stream zu schreiben. Dies löst auch die write()-Methode aus, die im WritableStream() Konstruktor angegeben ist, wie oben besprochen.
Nachdem alle Chunks geschrieben wurden, führen wir die ready-Überprüfung erneut durch, um sicherzustellen, dass der letzte Chunk fertig geschrieben wurde und alle Arbeiten abgeschlossen sind. Wenn diese ready-Überprüfung erfüllt ist, rufen wir WritableStreamDefaultWriter.close() auf, um den Stream zu schließen. Dies löst auch die close()-Methode aus, die im WritableStream() Konstruktor angegeben ist, wie oben besprochen.
Wie Sie beim Studieren des WritableStream() Syntax-Skeletts bemerkt haben, können die Methoden start(), write() und close() optional einen controller-Parameter erhalten. Dieser enthält eine Instanz der WritableStreamDefaultController Schnittstelle, die vom Entwickler verwendet werden kann, um den Stream nach Bedarf weiter zu steuern.
Dieser hat derzeit nur eine verfügbare Methode — WritableStreamDefaultController.error(), die bei Aufruf dazu führt, dass zukünftige Interaktionen mit dem Stream fehlerhaft sind. Dies ist nützlich, wenn ein anderer Teil einer App schiefgeht und Sie den Fehler an den Stream weitergeben möchten, damit das gesamte System sauber fehlschlägt, anstatt zu riskieren, dass Garbage still in den Stream geschrieben wird (oder etwas ähnlich Schlechtes).
Wie oben erwähnt, rufen wir die close()-Methode auf, wenn das Schreiben abgeschlossen ist, wodurch die close()-Methode ausgelöst wird, die im WritableStream() Konstruktor angegeben ist.
Wir könnten den Stream auch abbrechen, indem wir WritableStreamDefaultWriter.abort() aufrufen.
Der Unterschied besteht darin, dass beim Aufruf von close alle zuvor in die Warteschlange gestellten Chunks geschrieben und beendet werden, bevor der Stream geschlossen wird.
Beim Aufruf von abort werden alle zuvor in die Warteschlange gestellten Chunks einfach sofort verworfen und dann wird der Stream in einen Fehlerzustand versetzt. Dies löst auch jede abort()-Methode aus, die im WritableStream() Konstruktor angegeben ist.
Der Bauplan für ein besseres Internet.
Besuche die gemeinnützige Muttergesellschaft der Mozilla Corporation, die Mozilla Foundation.
Teile dieses Inhalts sind ©1998–2026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfügbar unter einer Creative-Commons-Lizenz.