Генераторы, отмена fetch и управление памятью

Генераторы

Функция-генератор может приостановить исполнение контекста где-нибудь посередине и удалить его из стека до завершения. При повторной активации контекст возобновляется и вновь кладётся на стек.

function* gen() {
  yield 1;
  return 2;
}
 
const g = gen();
g.next().value; // 1
g.next().value; // 2

Инструкция yield возвращает значение наружу и приостанавливает работу контекста, снимая его со стека. При следующем вызове next() тот же контекст снова кладётся на стек и продолжается.


Как отменить fetch-запрос?

У нативных промисов нет прямого способа отмены. Для отмены fetch используется AbortController: его signal передаётся в запрос, а вызов abort() прерывает один или несколько запросов.

const controller = new AbortController();
 
fetch(url, { signal: controller.signal })
  .then((res) => res.json())
  .catch((err) => {
    if (err.name === "AbortError") console.log("Запрос отменён");
  });
 
controller.abort(); // отменяем

Управление памятью

JavaScript управляет памятью автоматически через сборщик мусора (garbage collector). Основной алгоритм — mark-and-sweep: объекты, до которых нельзя «дотянуться» от корней (globalThis, стек вызовов), считаются недостижимыми и освобождаются.

Типичные причины утечек:

  • глобальные переменные, которые не очищаются;
  • забытые таймеры и подписки на события;
  • замыкания, удерживающие ссылки на большие объекты;
  • ссылки из детачнутых DOM-узлов.

См. также