Проблема с несколькими setInterval
s имеет две стороны. Первый, как вы указали, так как весь Javascript в браузерах (в настоящее время) является однопоточным, выполнение одного таймера может задержать выполнение следующего таймера. ( Рабочие потоки , тем не менее; Firefox уже имеет их , как и Safari 4 [и, возможно, другие].) Во-вторых, таймер происходит с заданным интервалом, но если ваш обработчик все еще работает после истечения этого интервала, второй интервал полностью пропущен. Например, таймер может мешать самому себе.
Эта последняя часть нуждается в дополнительном объяснении: скажем, у вас setInterval в 10 мс (это самая быстрая скорость, которую вы можете ожидать от любой реализации; возможно, она зажата так, что не работает быстрее). Если ваш обработчик занимает 13 мс, интервал, который должен был произойти через 10 мс после его начала, будет полностью пропущен.
Я обычно использую setTimeout
для такого рода вещей. Когда мой обработчик срабатывает, я делаю свою работу и затем планирую следующее событие в конце обработчика. Затем (в пределах того, в чем вы можете быть уверены), я знаю, что следующее событие произойдет через этот интервал.
Для того, что вы делаете, кажется, что лучше всего использовать один «импульсный» таймер, работающий с тем, что ему нужно делать с импульсом. Независимо от того, использует ли этот импульсный таймер setInterval
или setTimeout
, это оценочный вызов, основанный на том, что вы видите с вашим реальным кодом.