@choupa
Архитектор (обычный, который строит)

Что произойдёт в setInterval-вызовами, если они были запущены внутри объекта, который был убит?

В конструкторе запускаются вызовы какого-то метода через setInterval:

function Figure()   {
     ...
     this.interval = setInterval( this.swing );
     ...
}

var fig = new Figure();


Потом через какое-то время удаляю соответствующий объект:

fig = null;

Вопросы:
Что будет с асинхронными вызовами именно методов это же объекта?
Действительно ли объект дестроится?
  • Вопрос задан
  • 70 просмотров
Решения вопроса 2
Seasle
@Seasle Куратор тега JavaScript
Чтобы делать такие фокусы, надо будет написать метод, например preapreDestroy:
class Some {
  constructor() {
    this.interval = setInterval(this.method, 100);
  }

  method() {
    console.log(`Date.now: ${Date.now()}`);
  }

  prepareDestroy() {
    clearInterval(this.interval);
  }
}

const sleep = duration => new Promise(resolve => setTimeout(resolve, duration));

(async () => {
  let some = new Some();

  await sleep(3000);

  some.prepareDestroy();
  some = null;
})();

Вариант 2: перевести setInterval на requestAnimationFrame
Ответ написан
john36allTa
@john36allTa
alien glow of a dirty mind
Функция swing передастся как коллбэк и с заданным интервалом будет срабатывать, правда внутри свинг все обращения к свойствам и методам this.* вернут undefined
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@choupa Автор вопроса
Архитектор (обычный, который строит)
Осознал ошибочность затеи, т.к. всё равно в асинхронную функцию не могу передать контекст объекта, а именно ради этого я и хотел запускать setInterval из конструктора. Буду запускать setInterval не изнутри объекта, а в глобальном контексте, вынеся нужные свойства из объекта в глобальные.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы