Проводка

Jquery пауза перед выполнением. Зачем нам переменная intervalID? Вставка задержки в очередь эффектов

Jquery пауза перед выполнением. Зачем нам переменная intervalID? Вставка задержки в очередь эффектов

Сохраните эту страницу для тестирования приведенных ниже примеров.

Когда вы используете эффекты, jQuery создает для каждого выбранного элемента очередь функций, выполняющих анимацию. Каждая такая функция начинает выполняться лишь после того, как закончится выполнение предыдущей. Существует ряд методов, позволяющих получать информацию о состоянии очереди или управлять ею. Эти методы приведены в таблице ниже:

Одним из способов преодоления проблемы является использование конкатенации различных методов с помощью точечной нотации, то есть. Чтобы исчезнуть и появиться сразу после того, как элемент совершенно бесполезен, но он доказывает, что техника работает, потому что она позволяет нам выполнять функции с ожидаемым временем.

На этом этапе мы будем вводить в заблуждение, чтобы написать такой код. Точечная нотация позволяет вам выполнять методы только на одном и том же объекте или для точности: на объекте, возвращаемом из предыдущего метода, поэтому нет смысла применять метод.

Можете сами создать очередь эффектов, объединив в обычной цепочке вызовов функции, создающие анимационные эффекты, как показано в примере ниже:

$(function() { $("form").css({"position": "fixed", "top": "70px", "z-index": "2"}); $("h1").css({"position": "fixed", "z-index": "1", "min-width": "0"}); var timespan = "slow"; cycleEffects(); function cycleEffects() { $("h1") .animate({left: "+=100"}, timespan) .animate({left: "-=100"}, timespan) .animate({height: 223,width: 700}, timespan) .animate({height: 30,width: 500}, timespan) .slideUp(timespan) .slideDown(timespan, cycleEffects); } }); Запустить пример

Здесь, наконец, работает водопадное меню! Мы работали над проблемой задержки, назначая разные времена различным строкам таблицы. Многие блоги лицензируют свои статьи. Часто лицензия позволяет копировать текст и фотографии, чтобы указать, кто автор оригинала со ссылкой. Тем не менее, спорная тема - копирование целых статей.

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

В этом сценарии с помощью обычной цепочки вызовов методов jQuery создается серия анимационных эффектов, применяемых к элементу h1. В последнем эффекте в качестве функции обратного вызова используется функция cycleEffects(), которая повторно запускает анимационный процесс с самого начала.

Циклические эффекты подобного рода очень быстро надоедают, и их следует избегать в повседневной практике. Поначалу они завораживают, но вскоре начинают вызывать раздражение, доставляя пользователям лишь головную боль. В примере этот процесс используется только для того, чтобы показать, как работают очереди эффектов.

До сих пор многие сайты соблюдали его и обращались ко мне за дополнительными разрешениями. Проблема с другими часто заключается в том, что нет способа найти их без обратной связи. В двух словах она ищет веб-сайты, подобные вашим. В конце концов, это сортирует их для вас. Это означает, что это имеет смысл для дополнения. После его установки вы увидите две панели - «Отчеты и настройки». В отчетах вы можете запустить проверку заданий на копирование. Однако задержка не влияет на скорость вашего блога для других посетителей.

По завершении запросов поиск останавливается, и вы можете сбросить его через час, чтобы проверить остальную часть статей. Когда он будет завершен, вы увидите в разделе «Отчеты» статьи, которые вы просмотрели, чтобы оценить, насколько они были скопированы, и их названия. Вы также найдете информацию об этом на домашней странице панели управления. Как только вы проверите их лично, вы можете их игнорировать, пометить «предупреждением», «успешным изменением автора» или «с разрешением на копирование». Существует также возможность исключить домен из любых будущих поисков.

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

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

В чем разница между языком программирования и скриптов? Для многих проблема спорная, многие говорят, что языки сценариев на самом деле являются языками программирования. Если вы спросите меня - языки сценариев являются динамическими, но не программными. Программы - это те языки, которые сначала проходят компиляцию, которая приводит к генерации машинного кода, который будет выполняться процессором устройства. Языки скриптов не компилируются, а интерпретируются. Это означает, что другая программа, называемая интерпретатором, загружает свой программный код и генерирует инструкции для процессора нижнего уровня аналогичным образом.

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

Отображение элементов из очереди эффектов

Для просмотра содержимого очереди эффектов можно использовать метод queue() . Правда, пользы от этого будет не очень много, поскольку очередь может содержать один из двух возможных типов объектов данных. Если эффект выполняется, то соответствующим ему элементом очереди является строковое значение inprogress. Если же эффект не выполняется, то элементом очереди является функция, которая будет вызываться.

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

Все эффекты jQuery выполняются функцией doAnimation() , и поэтому вам не удастся определить, какой именно будет следующая анимация. Тем не менее, приступая к работе с очередью, всегда полезно просмотреть ее содержимое. Соответствующий пример приведен ниже:

") .appendTo("body").css({ position: "fixed", "z-index": "2", "border-collapse": "collapse", top: 100 }); var timespan = "slow"; cycleEffects(); printQueue(); function cycleEffects() { $("h1") .animate({left: "+=100"}, timespan) .animate({left: "-=100"}, timespan) .animate({height: 223,width: 700}, timespan) .animate({height: 30,width: 500}, timespan) .slideUp(timespan) .slideDown(timespan, cycleEffects); } function printQueue() { var q = $("h1").queue(); var qtable = $("table"); qtable.html("Длина очереди:" + q.length + ""); for (var i = 0; i < q.length; i++) { var baseString = "" + i + ":"; if (q[i] == "inprogress") { $("table").append(baseString + "Выполняется"); } else if (q[i].name == "") { $("table").append(baseString + q[i] + ""); } else { $("table").append(baseString + q[i].name + ""); } } setTimeout(printQueue, 500); } }); Запустить пример

В строго типизированных языках нам нужно объявить переменные, указав, какой тип они есть, а затем мы можем назначить им только значения этого типа. Для плохо типизированных языков мы можем назначить другой тип значения для одной и той же переменной. Имя целочисленных переменных достаточно понятно. Можно использовать как отрицательные, так и положительные числа. Также имеются числа с плавающей запятой, которые переустанавливаются на объекты.

Строковые литералы - это просто текстовые переменные. Массивы представляют собой набор элементов. Это означает, что мы не обязаны иметь элементы массива того же типа. Мы можем иметь массив, в котором первый элемент является числом, второй - объектом, третий - строкой, а четвертый - функцией. Объекты характеризуются скоринговыми парами, где шрам обозначается строкой, а значение может быть любого типа.

В этом примере элемент form нам не нужен, в связи с чем мы убираем его из DOM и заменяем простым элементом table, который будем использовать для отображения содержимого очереди. В код добавлена также функция printQueue(), которая периодически вызывает саму себя через определенные промежутки времени. Эта функции вызывает метод queue(), а также отображает в элементе table количество элементов в очереди и некоторую информацию о них. Как уже подчеркивалось, особой ценности эта информации не представляет, однако она позволяет получить некоторую общую картину происходящего.

Это также упрощает переписывание функций - просто установите другие команды в качестве значения объекта. Скорость загрузки выделяется как один из самых важных аспектов, которые могут либо создать, либо разрушить ваш бизнес в Интернете. Он имеет множество прогрессивных опций, включая страницу, браузер, кеширование базы данных, кеширование объектов, сжатие файлов и многое другое.

Вы можете легко установить этот плагин и использовать все его функции. Поскольку сервер не требует загрузки всего содержимого сразу, этот плагин помогает мгновенно загружать часть вашего сайта. Этот плагин поможет вам оценить производительность вашего сайта.

При первом вызове функции cycleEffects() в очереди эффектов находится шесть элементов, первый из которых находится в состоянии выполнения. Другие элементы являются экземплярами функции doAnimation(). По завершении выполнения каждого эффекта jQuery удаляет соответствующий элемент из очереди. Как только заканчивается выполнение последнего из находящихся в очереди эффектов, происходит повторный вызов функции cycleEffects(), восстанавливающей первоначальное состояние очереди, в котором в ней содержится шесть элементов.

Этот плагин создает загрузку сторонних скриптов. При загрузке страницы начинается сценарий. Это даже гарантирует, что ваша база данных будет хорошей. Он даже смещает скрипты, которые влияют на время загрузки вашего сайта в нижней части страницы, чтобы увеличить скорость загрузки. Мы столкнулись с относительно простой проблемой. Конечно, все данные должны были быть одинаковыми для всех клиентов, и они должны были меняться каждую секунду.

Но эта простая проблема очень нас беспокоила, и эта статья была создана для решения проблем и решений. Все проблемы были вызваны двумя причинами. Значительная часть клиентов имеет временное смещение в основном за несколько минут или даже часов. Вторая - неточность таймеров в браузерах.

Остановка эффектов и очистка очереди

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

Объяснение причины, почему это происходит, можно найти в статье Джона Ресига, в которой обсуждается принцип работы таймеров в браузерах. Прежде всего, это связано с тем, что вся обработка выполняется в одном потоке, поэтому, если браузер выполняет разный фрагмент кода в данный момент, таймер должен подождать.

Мы узнали несколько уроков из наших ошибок

Браузер всегда имеет другое время, чем сервер Единственный способ синхронизации времени всех клиентов - получить текущее время сервера на клиенте. На период таймера нельзя рассчитывать на вычисления. В клиентской логике никогда не рассчитывайте с интервалом, который контролирует выполнение логики обновления, но с текущим временем отклонения системы. Хотя это заманчиво, обратный отсчет не должен работать, устанавливая таймер на 1 секунду, а затем вычитая его, вызывая метод из переменной, содержащей количество оставшихся секунд.

По умолчанию оба аргумента имеют значения false, означающие, что из очереди удаляется лишь текущий эффект и что анимируемые свойства сохраняют значения, которые они имели на момент остановки выполнения эффекта. Если очередь не очищается, то jQuery переходит к следующему эффекту и выполняет его, как обычно.

Пример использования метода stop() приведен ниже:

Панели: создать тип данных

Такой вывод не будет точным. Решение состоит в том, чтобы перезаписать метод обновления путем повторного вычисления количества оставшихся секунд путем вычитания целевого времени, заданного сервером, с текущего времени, обработанного отклонением. Наш новый тип будет состоять только из двух частей: имени и функции шепота.

Имя типа отображается, когда пользователь записывает данные. Белый список возвращает список входных объектов, каждый из которых содержит имя соответствующей панели браузера. Его полное определение выглядит так. У нас уже есть тип данных готовый, нам будет легко создать команду переключения панели.

$(function() { $("h1").css({"position": "fixed", "z-index": "1", "min-width": "0"}); $("form").remove(); $("

") .appendTo("body").css({ position: "fixed", "z-index": "2", "border-collapse": "collapse", top: 100 }); $("СтопСтарт") .appendTo($("").appendTo("body") .css({position: "fixed", "z-index": "2", "border-collapse": "collapse", top: 100, left:200 })).click(function(e) { $(this).text() == "Стоп" ? $("h1").stop(true, true) : cycleEffects(); }); var timespan = "slow"; ... }); Запустить пример

Исходный код встроенных команд

Давайте добавим несколько советов, которые не пришли нигде. Изучение исходного кода встроенных команд и типов данных может быть очень полезным. Если у вас нет исходного кода, вы найдете последние версии файлов по следующим адресам. Как взаимодействовать с другими расширениями Давайте покажем команду, которая ищет тексты песен. Связь с другими расширениями проста, потому что вы можете просмотреть их исходный код. Внедрение асинхронного шепота. Все типы данных, которые мы видели, работали синхронно, то есть они сразу же вернули свои значения.

Для демонстрации того, как работает метод stop(), в документ добавлены две кнопки. После щелчка на кнопке "Стоп" вызывается метод stop(), которому передаются два аргумента true. Это приводит к очистке оставшейся части очереди эффектов и немедленной установке целевых значений для анимируемых свойств элемента. Поскольку при использовании метода stop() функции обратного вызова не вызываются, циклическое выполнение метода cycleEffects() прерывается, и анимация прекращается. После щелчка на кнопке "Пуск" вызывается метод cycleEffects(), что приводит к возобновлению анимации.

Запустить скрипт после загрузки и запуска страницы

Они полезны, если для типа данных требуется трудоемкая задача, прежде чем предлагать значения, чаще всего при вызове внешней службы. Реализация асинхронного шепота проста. Функция обратного вызова парсера ожидает только одного объекта данных, поэтому его нужно вызывать для каждого предсказанного выражения один раз, даже если тип данных имеет несколько доступных значений за раз. Это немного отличается от синхронного вызова, для которого предлагаемое предложение возвращает поле. Предлагаемые методы обычно возвращают пустое поле, когда они отвечают асинхронно, но могут также возвращать одно или несколько значений синхронно, если они доступны. Поскольку асинхронная активность вызова занимает много времени, и поскольку метод предложения можно вызвать после каждого нажатия клавиши пользователя, вам следует рассмотреть возможность выполнения отложенного выполнения и кеширования. Например, если вы хотите сказать «Привет» каждый раз, когда страница загружается, ваш код может выглядеть так.

Щелчок на кнопке "Пуск" во время выполнения анимации не смутит jQuery. Это лишь приведет к тому, что эффекты, используемые методом cycleEffects(), добавятся в очередь. Использование функций обратного вызова означает, что длина очереди эффектов будет испытывать незначительные колебания, однако это не отразится на анимации, и она будет продолжаться, как обычно.

Вот пример команды, которая делает так. Поэтому начните и попытайтесь что-то создать. Это название было дано проекту со времен так называемой «выживающей» возможности. Надеюсь, это будет некоторым вдохновением для некоторых из вас. Образцы не показывают полные исходные коды и не служат в качестве руководства! В работе описываются способы связи между загрузками, серверами и всеми функциями блока в программе.

Определение терминов и введение в проблему

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

Вставка задержки в очередь эффектов

Метод delay() позволяет вставить паузу между двумя эффектами, находящимися в очереди. Этот метод принимает один аргумент, который позволяет задать длительность паузы в миллисекундах. Пример использования метода delay() представлен ниже:

$(function() { $("form").css({"position": "fixed", "top": "70px", "z-index": "2"}); $("h1").css({"position": "fixed", "z-index": "1", "min-width": "0"}); var timespan = "slow"; cycleEffects(); function cycleEffects() { $("h1") .animate({left: "+=100"}, timespan) .animate({left: "-=100"}, timespan) .delay(1000) .animate({height: 223,width: 700}, timespan) .animate({height: 30,width: 500}, timespan) .delay(1000) .slideUp(timespan) .slideDown(timespan, cycleEffects); } });

В этом сценарии в последовательность анимационных эффектов вставлены две паузы, длительность каждой из которых составляет одну секунду.

Вставка функций в очередь

Можно добавлять в очередь собственные функции с помощью метода queue(), и они будут выполняться точно так же, как и стандартные методы эффектов. Этой возможностью удобно пользоваться для запуска других анимационных процессов, корректного выхода из цепочки анимаций на основе значения внешней переменной и многих других целей. Соответствующий пример содержится ниже:

$(function() { $("form").css({"position": "fixed", "top": "70px", "z-index": "2"}); $("h1").css({"position": "fixed", "z-index": "1", "min-width": "0"}); var timespan = "slow"; cycleEffects(); function cycleEffects() { $("h1") .animate({left: "+=100"}, timespan) .animate({left: "-=100"}, timespan) .queue(function() { $("img").fadeTo(timespan, 0).fadeTo(timespan, 1); $(this).dequeue(); }) .animate({height: 223,width: 700}, timespan) .animate({height: 30,width: 500}, timespan) .slideUp(timespan) .slideDown(timespan, cycleEffects); } }); Запустить пример

Переменная this ссылается на объект jQuery, для которого был вызван этот метод. Эта возможность весьма полезна, поскольку в некоторый момент вы обязательно должны вызвать в своей функции метод dequeue() , чтобы сделать возможным выполнение следующего эффекта или функции в очереди. В этом примере метод queue() используется для добавления функции, которая выполняет анимацию прозрачности элемента с использованием метода fade().

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

Можно действовать иначе и передавать функции один аргумент, представляющий следующую функцию в очереди. В подобных случаях для перехода к следующему эффекту нужно вызвать эту функцию самостойтельно, как показано в примере ниже:

Function cycleEffects() { $("h1") .animate({left: "+=100"}, timespan) .animate({left: "-=100"}, timespan) .queue(function(nextFunction) { $("img").fadeTo(timespan, 0).fadeTo(timespan, 1); nextFunction(); }) .animate({height: 223,width: 700}, timespan) .animate({height: 30,width: 500}, timespan) .slideUp(timespan) .slideDown(timespan, cycleEffects); }

Если не вызвать следующую функцию или метод dequeue, то дальнейшее выполнение находящихся в очереди эффектов прекратится.

В JavaScript есть внутренний таймер, который предоставляет возможность запускать функции через определённое время. Для этого используются функции setTimeout() или setInterval() . Они не имеют собственного объекта, а являются методами объекта window .

setTimeout()

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

Основная форма:

SetTimeout(функция[, задержка, аргумент1, аргумент2, ...])

Альтернативная форма:

SetTimeout(код[, задержка]) функция Имя функции, которая должна быть запущена. Функцию можно задать непосредственно при вызове setTimeout() . код Строка кода, которая будет преобразована в анонимную функцию. задержка Необязательный параметр. Время в миллисекундах, через которое должна выполниться функция. По умолчанию устанавливается 0. аргумент1, аргумент2, ... Аргументы, которые будут переданы в функцию.

В примере, приведённом ниже, представлены два вызова метода setTimeout() , которые приведут к одному результату.

SetTimeout(function() { alert("Прошла 1 секунда"); }, 1000); // или setTimeout("alert("Прошла 1 секунда")", 1000);

Альтернативная форма не рекомендуется для использования. Для этого есть много причин, но основные - это потеря производительности и возможные проблемы при минимизации кода. Эта форма существует только для совместимости со старыми скриптами.

Метод setTimeout() возвращает идентификатор таймера. Он используется для отмены таймера.

Вызов setTimeout() устанавливает задержку только для переданной функции. Всё, что следует за этим методом, продолжает выполняться без паузы во времени.

Отмена setTimeout

Для отмены действия setTimeout() используется метод clearTimeout() .

ClearTimeout(идентификатор) идентификатор Идентификатор таймера, полученный при вызове setTimeout() .

Пример использования setTimeout BOM-интерфейс Заморозить на 3 секунды var button = document.body.firstElementChild; button.onclick = function() { button.disabled = true; setTimeout(function() { /* запуск таймера */ button.disabled = false; }, 3000); };

Заморозить на 3 секунды

setInterval()

Метод setInterval() используется для многократного запуска определённой функции через заданный промежуток времени. Синтаксис этого метода полностью аналогичен .

Основная форма:

SetInterval(функция[, задержка, аргумент1, аргумент2, ...])

Альтернативная форма:

SetInterval(код[, задержка]) функция Имя функции, которая будет повторяться. Функцию можно задать непосредственно при вызове setInterval() . код Строка кода, которая будет преобразована в анонимную функцию. задержка Необязательный параметр. Время в миллисекундах, задающее интервал между запусками функции. По умолчанию устанавливается 0. аргумент1, аргумент2, ... Аргументы, которые будут переданы в функцию при каждом запуске.

Ниже приведён пример, в котором оба вызова метода setInterval() приведёт к одному результату.

SetInterval(function() { alert("Прошла 1 секунда"); }, 1000); // или setInterval("alert("Прошла 1 секунда")", 1000);

Метод setInterval() возвращает идентификатор таймера. Он используется для отмены таймера.

Вызов setInterval() устанавливает интервал только для переданной функции. Весь код, который следует за этим методом, продолжает выполняться без паузы во времени.

Отмена setInterval

Метод setInterval() будет запускать переданную функцию до тех пор, пока не будет принудительно остановлен. Для этого используется метод clearInterval() .

ClearInterval(идентификатор) идентификатор Идентификатор таймера, полученный при вызове setInterval() .

Пример использования setInterval BOM-интерфейс Заморозить на 5 секунд var button = document.body.firstElementChild; button.onclick = function() { var time = 5; button.disabled = true; button.innerHTML = "Разморозится через " + time; var interval_id = setInterval(function() { /* запуск таймера */ time--; if (time != 0) { button.innerHTML = "Разморозится через " + time; } else { clearInterval(interval_id); /* остановка таймера */ button.disabled = false; button.innerHTML = "Заморозить на 5 секунд"; } }, 1000); };

Заморозить на 5 секунд

Особенности использования таймеров Минимальная задержка ограничена

Теоретически в таймерах можно указывать нулевую задержку времени. Однако, функция всё равно будет запускаться с некоторой задержкой. В действующем стандарте минимальная задержка установлена в 4 мс. В современных браузерах она составляет от 4 до 10 мс. Это сделано для того, чтобы вызов setInterval() с нулевой задержкой не привёл к перегрузке процессора или сервера.

Максимальная задержка ограничена

Большинство браузеров хранят время задержки таймера в виде 32-битного целого числа. Это означает, что при использовании значения больше, чем 2147483647 (примерно 25 дней), произойдёт переполнение памяти и таймер запустится без задержки.

Задержка имеет погрешность

Задержка может отличаться от установленной из-за загрузки системы другими процессами. В этом можно убедиться на примере, представленном ниже. Задержка установлена 100 мс:

Задержка может ограничиваться браузером

В неактивных закладках задержка может сильно отличаться от заданной. Многие браузеры в целях экономии ресурсов для неактивных закладок устанавливают минимальную задержку в 1000 мс. Это будет видно, если при запущенном примере, приведённом выше, на несколько секунд перейти в другую вкладку.

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

Если время выполнения функции окажется больше, чем заданный интервал, тогда повторный запуск не будет осуществлён вовремя. Таймер будет ждать, пока функция закончит выполнение, а после этого сразу же запустит её снова (без задержки). При таком варианте фактический интервал может сильно отличаться от заданного.

Всё вышесказанное подтверждается следующим примером. Интервал таймера задан 50 мс. Время выполнения функции можно варьировать от 0 до 200 мс. Если введённое значение меньше 50, тогда интервал таймера будет соответствовать заданному (с некоторой погрешностью, про которую писалось выше). А если больше 50, тогда интервал между запусками будет равен времени выполнения функции.