Генераторы, отмена 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-узлов.
См. также
- JS Objects & Async — промисы и async
- Контекст выполнения — call stack