ReadableStream: cancel()-Methode
Baseline
Weitgehend verfügbar
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Januar 2019 browserübergreifend verfügbar.
Hinweis: Diese Funktion ist in Web Workers verfügbar.
Die cancel()-Methode der ReadableStream-Schnittstelle gibt ein Promise zurück, das aufgelöst wird, wenn der Stream abgebrochen wird.
Der Abbruch wird verwendet, wenn Sie den Stream vollständig abgeschlossen haben und keine weiteren Daten mehr benötigen, selbst wenn noch Teile zum Lesen bereitstehen.
Diese Daten gehen verloren, nachdem der Abbruch aufgerufen wurde, und der Stream ist nicht mehr lesbar.
Um diese Teile dennoch zu lesen und den Stream nicht vollständig zu verwerfen, würden Sie ReadableStreamDefaultController.close() verwenden.
Syntax
cancel()
cancel(reason)
Parameter
reasonOptional-
Ein für Menschen lesbarer Grund für den Abbruch. Dieser wird an die zugrunde liegende Quelle übergeben, die ihn möglicherweise verwendet.
Rückgabewert
Ein Promise, welches mit dem Wert undefined erfüllt wird.
Ausnahmen
TypeError-
Der Stream, den Sie versuchen zu abbrechen, ist kein
ReadableStreamoder er ist gesperrt.
Beispiele
Im folgenden Beispiel wird ein Stream verwendet, um die WHATWG HTML-Spezifikation stückweise abzurufen; jeder Teil wird nach dem String "service workers" durchsucht. Wenn der Suchbegriff gefunden wird, wird cancel() verwendet, um den Stream abzubrechen – die Aufgabe ist abgeschlossen, daher wird er nicht mehr benötigt.
<pre id="output"></pre>
const searchTerm = "service workers";
// Chars to show either side of the result in the match
const contextBefore = 30;
const contextAfter = 30;
const caseInsensitive = true;
const url = "https://html.spec.whatwg.org/";
log(`Searching '${url}' for '${searchTerm}'`);
fetch(url)
.then((response) => {
log("Received headers");
const decoder = new TextDecoder();
const reader = response.body.getReader();
const toMatch = caseInsensitive ? searchTerm.toLowerCase() : searchTerm;
const bufferSize = Math.max(toMatch.length - 1, contextBefore);
let bytesReceived = 0;
let buffer = "";
let matchFoundAt = -1;
return reader.read().then(function process(result) {
if (result.done) {
log("Failed to find match");
return;
}
bytesReceived += result.value.length;
log(`Received ${bytesReceived} bytes of data so far`);
buffer += decoder.decode(result.value, { stream: true });
// already found match & just context-gathering?
if (matchFoundAt === -1) {
matchFoundAt = (
caseInsensitive ? buffer.toLowerCase() : buffer
).indexOf(toMatch);
}
if (matchFoundAt === -1) {
buffer = buffer.slice(-bufferSize);
} else if (
buffer.slice(matchFoundAt + toMatch.length).length >= contextAfter
) {
log("Here's the match:");
log(
buffer.slice(
Math.max(0, matchFoundAt - contextBefore),
matchFoundAt + toMatch.length + contextAfter,
),
);
log("Canceling fetch");
reader.cancel();
return;
} else {
log("Found match, but need more context…");
}
// keep reading
return reader.read().then(process);
});
})
.catch((err) => {
log(
"Something went wrong. See devtools for details. Does the response lack CORS headers?",
);
throw err;
});
Spezifikationen
| Spezifikation |
|---|
| Streams> # ref-for-rs-cancel③> |
Browser-Kompatibilität
Siehe auch
ReadableStream()-Konstruktor- Verwendung von lesbaren Streams