Spec-Zone.ru › Web APIs

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API