setTimeout или setInterval?

С вашей надписью выше используйте span { white-space:nowrap }. Это так хорошо, как вы можете ожидать.

725
задан Tiny Giant 10 September 2015 в 16:17
поделиться

6 ответов

Они по сути пытаются сделать то же самое, но подход setInterval будет более точным, чем подход setTimeout , поскольку setTimeout ждет 1000 мс, запускает функцию и затем устанавливает другое время ожидания. Таким образом, период ожидания на самом деле немного больше 1000 мс (или намного больше, если выполнение вашей функции занимает много времени).

Хотя можно подумать, что setInterval выполнит точно каждые 1000 мс, важно отметить, что setInterval также будет задерживать, так как JavaScript не является многопоточным языком, что означает, что - если есть другие части скрипта, работающие - интервал будет иметь ждать, пока это не закончится.

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

Задержка почти всегда незначительна , но если вы программируете что-то действительно точное, вам следует воспользоваться самонастраивающимся таймером (который, по сути, является таймером на основе тайм-аута, который постоянно настраивается в соответствии с созданной задержкой)

648
ответ дан 22 November 2019 в 21:28
поделиться

Both setInterval and setTimeout return a timer id that you can use to cancel the execution, that is, before the timeouts are triggered. To cancel you call either clearInterval or clearTimeout like this:

var timeoutId = setTimeout(someFunction, 1000);
clearTimeout(timeoutId);
var intervalId = setInterval(someFunction, 1000),
clearInterval(intervalId);

Also, the timeouts are automatically cancelled when you leave the page or close the browser window.

4
ответ дан 22 November 2019 в 21:28
поделиться

Я использую setTimeout.

Очевидно, различие заключается в том, что setTimeout вызывает метод один раз, setInterval вызывает его повторно.

Вот хорошая статья, объясняющая разницу: Учебное пособие: таймеры JavaScript с setTimeout и setInterval

8
ответ дан 22 November 2019 в 21:28
поделиться

Я считаю, что метод setTimeout проще использовать, если вы хотите отменить время ожидания:

function myTimeoutFunction() {
   doStuff();
   if (stillrunning) {
      setTimeout(myTimeoutFunction, 1000);
   }
}

myTimeoutFunction();

Кроме того, если что-то пойдет не так в функции, она просто перестанет повторяться при первой ошибке, а не будет повторять ошибку каждую секунду.

22
ответ дан 22 November 2019 в 21:28
поделиться

setInterval облегчает отмену будущего выполнения вашего кода. Если вы используете setTimeout, вы должны отслеживать идентификатор таймера на случай, если вы захотите отменить его позже.

var timerId = null;
function myTimeoutFunction()
{
    doStuff();
    timerId = setTimeout(myTimeoutFunction, 1000);
}

myTimeoutFunction();

// later on...
clearTimeout(timerId);

против

function myTimeoutFunction()
{
    doStuff();
}

myTimeoutFunction();
var timerId = setInterval(myTimeoutFunction, 1000);

// later on...
clearInterval(timerId);
43
ответ дан 22 November 2019 в 21:28
поделиться

Есть ли разница?

Да. Тайм-аут выполняется определенное количество времени после вызова setTimeout (); Интервал выполняется через определенное количество времени после срабатывания предыдущего интервала.

Вы заметите разницу, если вашей функции doStuff () потребуется некоторое время для выполнения. Например, если мы представим вызов setTimeout / setInterval с . , запуск тайм-аута / интервала с * и выполнение кода JavaScript с [----- ] , временные шкалы выглядят следующим образом:

Timeout:

.    *  .    *  .    *  .    *  .
     [--]    [--]    [--]    [--]

Interval:

.    *    *    *    *    *    *
     [--] [--] [--] [--] [--] [--]

Следующая сложность заключается в том, что интервал срабатывает, когда JavaScript уже занят чем-то (например, обработкой предыдущего интервала). В этом случае интервал запоминается и происходит, как только предыдущий обработчик завершает работу и возвращает управление браузеру. Так, например, для процесса doStuff (), который иногда короткий ([-]), а иногда длинный ([-----]):

.    *    *    •    *    •    *    *
     [-]  [-----][-][-----][-][-]  [-]

• представляет интервал, который не может выполнить свой код сразу, и вместо этого было сделано ожидание.

Таким образом, интервалы пытаются «наверстать упущенное», чтобы вернуться в график. Но они не стоят в очереди друг над другом: за интервал может быть только одно ожидание выполнения. (Если все они будут поставлены в очередь, браузер получит постоянно расширяющийся список невыполненных выполнений!)

.    *    •    •    x    •    •    x
     [------][------][------][------]

x представляет интервал срабатывания, который не может быть выполнен или отложен, поэтому вместо этого он был отброшен.

Если Ваша функция doStuff () обычно выполняется дольше, чем установленный для нее интервал, браузер потребляет 100% ресурсов процессора, пытаясь ее обслуживать, и может стать менее отзывчивым.

Что вы используете и почему?

Chained-Timeout обеспечивает гарантированное время свободного времени для браузера; Интервал старается, чтобы выполняемая им функция выполнялась как можно ближе к запланированному времени за счет доступности пользовательского интерфейса браузера.

Я бы рассмотрел интервал для одноразовых анимаций, которые я хотел сделать максимально плавными, хотя Цепные таймауты более вежливы для текущих анимаций, которые будут происходить все время, пока страница загружается. Для менее требовательных применений (например, тривиальное обновление обновлений каждые 30 секунд или что-то в этом роде) вы можете безопасно использовать любой из них.

С точки зрения совместимости с браузером, setTimeout предшествует setInterval, но все браузеры, с которыми вы встретитесь сегодня, поддерживают оба. Последним препятствием на протяжении многих лет был IE Mobile в WinMo <6.5, но, надеюсь, это уже позади.

Интервал старается, чтобы выполняемая им функция выполнялась как можно ближе к запланированному времени за счет доступности пользовательского интерфейса браузера.

Я бы рассмотрел интервал для одноразовых анимаций, которые я хотел сделать максимально плавными, хотя Цепные таймауты более вежливы для текущих анимаций, которые будут происходить все время, пока страница загружается. Для менее требовательных применений (например, тривиальное обновление обновлений каждые 30 секунд или что-то в этом роде) вы можете безопасно использовать любой из них.

С точки зрения совместимости с браузером, setTimeout предшествует setInterval, но все браузеры, с которыми вы встретитесь сегодня, поддерживают оба. Последним препятствием на протяжении многих лет был IE Mobile в WinMo <6.5, но, надеюсь, это уже позади.

Интервал старается, чтобы выполняемая им функция выполнялась как можно ближе к запланированному времени за счет доступности пользовательского интерфейса браузера.

Я бы рассмотрел интервал для одноразовых анимаций, которые я хотел сделать максимально плавными, хотя Цепные таймауты более вежливы для текущих анимаций, которые будут происходить все время, пока страница загружается. Для менее требовательных применений (например, тривиальное обновление обновлений каждые 30 секунд или что-то в этом роде) вы можете безопасно использовать любой из них.

С точки зрения совместимости с браузером, setTimeout предшествует setInterval, но все браузеры, с которыми вы встретитесь сегодня, поддерживают оба. Последним препятствием на протяжении многих лет был IE Mobile в WinMo <6.5, но, надеюсь, это уже позади.

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

С точки зрения совместимости с браузером, setTimeout предшествует setInterval, но все браузеры, с которыми вы встретитесь сегодня, поддерживают оба. Последним препятствием на протяжении многих лет был IE Mobile в WinMo <6.5, но, надеюсь, это уже позади.

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

С точки зрения совместимости с браузером, setTimeout предшествует setInterval, но все браузеры, с которыми вы встретитесь сегодня, поддерживают оба. Последним препятствием на протяжении многих лет был IE Mobile в WinMo <6.5, но, надеюсь, это уже позади.

Что касается совместимости браузера, setTimeout предшествует setInterval, но все браузеры, которые вы встретите сегодня, поддерживают оба. Последним препятствием на протяжении многих лет был IE Mobile в WinMo <6.5, но, надеюсь, это уже позади.

Что касается совместимости браузера, setTimeout предшествует setInterval, но все браузеры, которые вы встретите сегодня, поддерживают оба. Последним препятствием на протяжении многих лет был IE Mobile в WinMo <6.5, но, надеюсь, это уже позади.

642
ответ дан 22 November 2019 в 21:28
поделиться
Другие вопросы по тегам:

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