Можно ли вызывать clearinterval напрямую через setinterval? - PullRequest
4 голосов
/ 15 марта 2020

Здравствуйте, могучие люди из inte rnet:)

Когда немного поигрался с некоторыми JS, я заметил, что не смог использовать возвращаемое значение setInterval(function, milliseconds) внутри clearInterval(var).

Вот рабочая версия очистки интервала:

const intervalId = setInterval(() => foo(), 500);
setTimeout(() => clearInterval(intervalId), 2000);

В этом примере интервал вызывает метод foo() каждые 500 мс. Через 2 с это будет остановлено clearInterval(intervalId), вложенным в setTimeout(function, milliseconds).

Не работает, используется setInterval внутри clearInterval:

setTimeout(() => clearInterval(setInterval(() => foo(), 500)), 2000);
  • ( Примечание: Замена синтаксиса функции стрелки для обычного вызова функции не изменила результатов)

В отличие от приведенного выше примера, здесь переменная не используется для удержания возвращаемого значения setInterval().
Все же это приводит к тому, что интервал никогда не вызывается / немедленно останавливается .
Это кажется мне очень странным (и потенциально может быть ошибкой? ).

Может кто-нибудь высказать свое мнение / объяснить это?
Спасибо:)

1 Ответ

3 голосов
/ 15 марта 2020

Да, вы можете установить интервал или тайм-аут, а затем очистить его с помощью идентификатора тайм-аута / интервала - , но , это не имеет особого смысла, потому что тогда функция интервала никогда не будет работать , потому что интервал будет очищен немедленно. Вот что здесь происходит. Если вы не хотите, чтобы интервал очищался немедленно, вы должны сохранить идентификатор интервала в переменной (как вы делаете с int выше).

Вместо того, чтобы хранить идентификатор интервала в переменной Вы также можете передать идентификатор интервала в IIFE, но это в основном делает то же самое - идентификатор интервала будет храниться в параметре, а не в отдельной переменной.

const foo = () => console.log('foo');

(int => {
  setTimeout(() => {
    clearInterval(int);
  }, 2000);
})(setInterval(foo, 500));

Я бы также рекомендовал:

  • Если ваш тайм-аут или интервал будет вызывать только функцию, просто передайте функцию сам . Не нужно оборачивать это в другое. Например, если контекст вызова не имеет значения, вы всегда можете заменить () => foo(); на foo();.
  • Использование int для имени переменной может сбить с толку тех, кто использует другие языки и ожидает int будет ключевым словом , а не именем переменной. Может, вместо этого назовите это intervalId?
...