ReadableStream: метод cancel()
Примечание: Эта функция доступна в Web Workers.
Метод cancel() интерфейса ReadableStream возвращает Promise, который выполняется, когда поток отменён.
Отмена используется, когда вы полностью закончили работу с потоком и не нуждаетесь в каких-либо данных из него, даже если есть порции данных, ожидающие чтения. Эти данные теряются после вызова cancel, и поток больше нечитаем. Чтобы прочитать эти порции данных и не полностью избавиться от потока, используйте ReadableStreamDefaultController.close().
Синтаксис
cancel() cancel(reason)
Параметры
reasonНеобязательно-
Человекопонятное описание причины отмены. Оно передаётся в исходный источник, который может или не может его использовать.
Возвращаемое значение
A Promise, который выполняется со значением undefined.
Исключения
TypeError-
Поток, который вы пытаетесь отменить, не является
ReadableStream, или он заблокирован.
Примеры
В примере Джейка Арчибальда отмена fetch используется поток для получения спецификации WHATWG HTML по частям; каждая часть ищется на строку "service workers". Когда поисковый термин найден, используется cancel() для отмены потока — задача завершена, поэтому она больше не нужна.
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/";
console.log(`Searching '${url}' for '${searchTerm}'`);
fetch(url)
.then((response) => {
console.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) {
console.log("Failed to find match");
return;
}
bytesReceived += result.value.length;
console.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
) {
console.log("Here's the match:");
console.log(
buffer.slice(
Math.max(0, matchFoundAt - contextBefore),
matchFoundAt + toMatch.length + contextAfter,
),
);
console.log("Cancelling fetch");
reader.cancel();
return;
} else {
console.log("Found match, but need more context…");
}
// keep reading
return reader.read().then(process);
});
})
.catch((err) => {
console.error(
"Something went wrong. See devtools for details. Does the response lack CORS headers?",
);
throw err;
});
Спецификации
| Спецификация |
|---|
| Потоки # ref-for-rs-cancel③ |
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari на IOS | Samsung Internet | WebView Android | |
cancel |
43 | 14 | 65 | 30 | 10.1 | 43 | 65 | 30 | 10.3 | 4.0 | 43 |
См. также
-
ReadableStream()конструктор - Использование читаемых потоков
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/cancel