Очередь и наложение вызовов в setInterval
var i = 1; var timer = setInterval(function() { alert(i) }, 20); setInterval(function() { alert('test') }, 3000); В данном коде раз в 3 секунды alert выдаёт 'test', всё остальное время - число 1. 1. Если сделать паузу при отображении alert'ом строки 'test', наложение вызовов мне вроде бы ясно: 1) следующий alert отобразит 1, следующий - 'test', далее наложения нет. 2. Если сделать паузу при отображении alert'ом числа 1, то следующий alert отобразит строку 'test'. Почему? Ведь по идее, следующим должен быть запланирован запуск этой же ф-ции (она становится в очередь один раз через 20мс) и только через 2800 секунды - запуск ф-ции, выдающей строку 'test'. Изначально я подумал, что, раз alert с числом активен, то соответствующая ф-ция уже вроде как стоит в очереди. Но в примере из статьи в учебнике (http://learn.javascript.ru/settimeou...в-setinterval) видно, что это не так: <input onclick="clearInterval(timer)" type="button" value="Стоп"> <script> var i = 1; var timer = setInterval(function() { alert(i++) }, 2000); //если немного подождать, alert блокирует работу скрипта, //но эта же ф-ция всё равно становится в очередь (хоть и 1 раз) </script> |
Цитата:
Но потоки таки влияют друг на друга и могут частично "сбивать" таймер друг у друга. Т.е. точного "отстчета" по времени исполнения не жди. Оно только стремиться к идиалу и не более того... |
думаю тут от браузера еще зависит
запусти этот код в опере (12) и в мозиле (27) можно и другие версии попробовать. увидишь, что в опере запуск функции становится в очередь, а в мозиле нет setInterval(function(){alert(1)},12); setInterval(function(){alert(2)},12); setInterval(function(){alert(3)},12); setInterval(function(){alert(4)},12); setInterval(function(){alert(5)},12); setInterval(function(){alert(6)},12); |
Отличная статья по теме:
Основной цикл в Javascript : http://habrahabr.ru/company/tradingview/blog/178261/ |
Цитата:
Увеличил задержку для наглядности и запустил в Опера12. Подождал после открытия первого алерта с "1" более 9-и сек: var i = 1; var timer = setInterval(function() { alert(i) }, 3000); setInterval(function() { alert('test') }, 9000); После 9-и сек ожидания жму "ОК". ТУТ ЖЕ вылазит 'test' и затем (ТУТ ЖЕ) - "1". Очевидно, что эти срабатывания были в очереди, причём ОБА (т.е., в очереди стояли срабатывания ОБОИХ таймеров). Вопрос лишь в том, почему именно такая последовательность ('test' -> "1"), а не наоборот. |
Не используйте alert и не ебите мозги. Реализация остановки всего потока - как пожелает левая пятка разработчика браузера. И даже если вы найдёте закономерность в конкретной версии браузера - совершенно не факт что в следующей или предыдущей версии всё не по-другому.
В рабочем js, а не высосанном из пальца, таймеры ведут себя предсказуемо. |
Цитата:
Цитата:
Но, похоже, Вы правы. Спасибо :thanks: |
Цитата:
console.log |
Цитата:
А если и говорить о console.log, то он бы данной проблемы не создал. |
Часовой пояс GMT +3, время: 01:07. |