WritableStream: WritableStream() Konstruktor
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since June 2022.
Hinweis: Diese Funktion ist in Web Workers verfügbar.
Der WritableStream()
-Konstruktor erzeugt eine neue WritableStream
-Objektinstanz.
Syntax
new WritableStream(underlyingSink)
new WritableStream(underlyingSink, queuingStrategy)
Parameter
underlyingSink
Optional-
Ein Objekt, das Methoden und Eigenschaften enthält, die das Verhalten der konstruierten Stream-Instanz definieren. Der an die Methoden dieses Objekts übergebene
controller
-Parameter ist einWritableStreamDefaultController
, der Abbruch- und Fehlersignale bereitstellt.underlyingSink
kann Folgendes enthalten:start(controller)
Optional-
Dies ist eine Methode, die unmittelbar nach der Konstruktion des Objekts aufgerufen wird. Der Inhalt dieser Methode wird vom Entwickler definiert und sollte darauf abzielen, Zugriff auf das zugrunde liegende Ziel zu erhalten. Wenn dieser Prozess asynchron durchgeführt wird, kann er ein Promise zurückgeben, um Erfolg oder Misserfolg zu signalisieren.
write(chunk, controller)
Optional-
Diese Methode, ebenfalls vom Entwickler definiert, wird aufgerufen, wenn ein neuer Datenblock (im
chunk
-Parameter angegeben) bereit ist, in das zugrunde liegende Ziel geschrieben zu werden. Sie kann ein Promise zurückgeben, um Erfolg oder Misserfolg des Schreibvorgangs zu signalisieren. Diese Methode wird nur aufgerufen, nachdem vorherige Schreibvorgänge erfolgreich waren und niemals, nachdem der Stream geschlossen oder abgebrochen wurde (siehe unten). close(controller)
Optional-
Diese Methode, ebenfalls vom Entwickler definiert, wird aufgerufen, wenn die Anwendung signalisiert, dass sie das Schreiben von Datenblöcken in den Stream beendet hat. Der Inhalt sollte alles Notwendige tun, um die Schreibvorgänge in das zugrunde liegende Ziel abzuschließen und den Zugriff darauf freizugeben. Wenn dieser Prozess asynchron ist, kann er ein Promise zurückgeben, um Erfolg oder Misserfolg zu signalisieren. Diese Methode wird nur aufgerufen, nachdem alle angestauten Schreibvorgänge erfolgreich waren.
abort(reason)
Optional-
Diese Methode, ebenfalls vom Entwickler definiert, wird aufgerufen, wenn die Anwendung signalisiert, dass sie den Stream abrupt schließen und in einen Fehlerzustand versetzen möchte. Sie kann, ähnlich wie
close()
, alle gehaltenen Ressourcen aufräumen, aberabort()
wird auch aufgerufen, wenn Schreibvorgänge noch angestaut sind — diese Datenblöcke werden verworfen. Wenn dieser Prozess asynchron ist, kann er ein Promise zurückgeben, um Erfolg oder Misserfolg zu signalisieren. Derreason
-Parameter enthält eine Zeichenfolge, die beschreibt, warum der Stream abgebrochen wurde.
queuingStrategy
Optional-
Ein Objekt, das optional eine Warteschlangenstrategie für den Stream definiert. Dies nimmt zwei Parameter an:
highWaterMark
-
Eine nicht-negative ganze Zahl — dies definiert die Gesamtanzahl an Datenblöcken, die in der internen Warteschlange enthalten sein können, bevor Gegendruck angewendet wird.
size(chunk)
-
Eine Methode mit einem Parameter
chunk
— dies gibt die Größe an, die für jeden Block in Bytes zu verwenden ist.
Hinweis: Sie könnten Ihre eigene benutzerdefinierte
queuingStrategy
definieren oder eine Instanz derByteLengthQueuingStrategy
oderCountQueuingStrategy
für diesen Objektwert verwenden. Wenn keinequeuingStrategy
angegeben ist, wird standardmäßig dieselbe wie beiCountQueuingStrategy
mit einer hohen Wasserlinie von 1 verwendet.
Rückgabewert
Eine Instanz des WritableStream
-Objekts.
Beispiele
Das folgende Beispiel veranschaulicht mehrere Funktionen dieser Schnittstelle.
Es zeigt die Erstellung des WritableStream
mit einem benutzerdefinierten Sink und einer API-bereitgestellten Warteschlangenstrategie. Anschließend wird eine Funktion namens sendMessage()
aufgerufen, die den neu erstellten Stream und eine Zeichenfolge übergibt.
Innerhalb dieser Funktion wird die Methode getWriter()
des Streams aufgerufen, die eine Instanz von WritableStreamDefaultWriter
zurückgibt.
Ein forEach()
-Aufruf wird verwendet, um jeden Block der Zeichenfolge in den Stream zu schreiben. Schließlich geben write()
und close()
Promises zurück, die verarbeitet werden, um den Erfolg oder Misserfolg von Blöcken und Streams zu behandeln.
const list = document.querySelector("ul");
function sendMessage(message, writableStream) {
// defaultWriter is of type WritableStreamDefaultWriter
const defaultWriter = writableStream.getWriter();
const encoder = new TextEncoder();
const encoded = encoder.encode(message);
encoded.forEach((chunk) => {
defaultWriter.ready
.then(() => defaultWriter.write(chunk))
.then(() => {
console.log("Chunk written to sink.");
})
.catch((err) => {
console.log("Chunk error:", err);
});
});
// Call ready again to ensure that all chunks are written
// before closing the writer.
defaultWriter.ready
.then(() => {
defaultWriter.close();
})
.then(() => {
console.log("All chunks written");
})
.catch((err) => {
console.log("Stream error:", err);
});
}
const decoder = new TextDecoder("utf-8");
const queuingStrategy = new CountQueuingStrategy({ highWaterMark: 1 });
let result = "";
const writableStream = new WritableStream(
{
// Implement the sink
write(chunk) {
return new Promise((resolve, reject) => {
const buffer = new ArrayBuffer(1);
const view = new Uint8Array(buffer);
view[0] = chunk;
const decoded = decoder.decode(view, { stream: true });
const listItem = document.createElement("li");
listItem.textContent = `Chunk decoded: ${decoded}`;
list.appendChild(listItem);
result += decoded;
resolve();
});
},
close() {
const listItem = document.createElement("li");
listItem.textContent = `[MESSAGE RECEIVED] ${result}`;
list.appendChild(listItem);
},
abort(err) {
console.log("Sink error:", err);
},
},
queuingStrategy,
);
sendMessage("Hello, world.", writableStream);
Sie finden den vollständigen Code in unserem einfachen Schreiberbeispiel.
Gegendruck
Aufgrund der Unterstützung von Gegendruck in der API kann seine Implementierung im Code weniger offensichtlich sein. Um zu sehen, wie Gegendruck implementiert ist, suchen Sie nach drei Dingen.
- Die
highWaterMark
-Eigenschaft, die beim Erstellen der Zählstrategie mitnew CountQueuingStrategy
festgelegt wird, bestimmt die maximale Datenmenge, die dieWritableStream
-Instanz in einem einzigenwrite()
-Vorgang verarbeiten wird. In diesem Beispiel ist es die maximale Datenmenge, die andefaultWriter.write()
in dersendMessage
-Funktion gesendet werden kann. - Die Eigenschaft
defaultWriter.ready
gibt ein Promise zurück, das aufgelöst wird, wenn das Sink (die erste Eigenschaft desWritableStream
-Konstruktors) mit dem Schreiben von Daten fertig ist. Die Datenquelle kann entweder mehr Daten mitdefaultWriter.write()
schreiben oderdefaultWriter.close()
aufrufen, wie im obigen Beispiel dargestellt. Ein zu frühes Aufrufen vonclose()
kann verhindern, dass Daten geschrieben werden. Aus diesem Grund ruft das BeispieldefaultWriter.ready
zweimal auf. - Das von der
write()
-Methode des Sinks zurückgegebenePromise
zeigt demWritableStream
und seinem Schreiber an, wanndefaultWriter.ready
aufzulösen ist.
Spezifikationen
Specification |
---|
Streams # ref-for-ws-constructor④ |
Browser-Kompatibilität
BCD tables only load in the browser