Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Очередь и наложение вызовов в setInterval (https://javascript.ru/forum/misc/45708-ochered-i-nalozhenie-vyzovov-v-setinterval.html)

Boolean_Type 13.03.2014 01:32

Очередь и наложение вызовов в 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>

ksa 13.03.2014 16:54

Цитата:

Сообщение от Boolean_Type
я подумал, что, раз alert с числом активен, то соответствующая ф-ция уже вроде как стоит в очереди

Никакой "очереди" как таковой нет. Это разные потоки, у них свой "таймер" и своя "жизнь".

Но потоки таки влияют друг на друга и могут частично "сбивать" таймер друг у друга.
Т.е. точного "отстчета" по времени исполнения не жди. Оно только стремиться к идиалу и не более того...

NeoN 13.03.2014 17:12

думаю тут от браузера еще зависит
запусти этот код в опере (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);

melky 13.03.2014 19:41

Отличная статья по теме:

Основной цикл в Javascript : http://habrahabr.ru/company/tradingview/blog/178261/

Boolean_Type 14.03.2014 17:11

Цитата:

Сообщение от ksa (Сообщение 302426)
Никакой "очереди" как таковой нет.

Не уверен.
Увеличил задержку для наглядности и запустил в Опера12. Подождал после открытия первого алерта с "1" более 9-и сек:
var i = 1;
var timer = setInterval(function() { alert(i) }, 3000);
setInterval(function() { alert('test') }, 9000);

После 9-и сек ожидания жму "ОК". ТУТ ЖЕ вылазит 'test' и затем (ТУТ ЖЕ) - "1". Очевидно, что эти срабатывания были в очереди, причём ОБА (т.е., в очереди стояли срабатывания ОБОИХ таймеров). Вопрос лишь в том, почему именно такая последовательность ('test' -> "1"), а не наоборот.

Aetae 14.03.2014 17:26

Не используйте alert и не ебите мозги. Реализация остановки всего потока - как пожелает левая пятка разработчика браузера. И даже если вы найдёте закономерность в конкретной версии браузера - совершенно не факт что в следующей или предыдущей версии всё не по-другому.
В рабочем js, а не высосанном из пальца, таймеры ведут себя предсказуемо.

Boolean_Type 14.03.2014 18:03

Цитата:

Сообщение от Aetae (Сообщение 302569)
... и не ебите мозги...

А по-другому в процессе обучения никак ;) Для меня, во всяком случае.

Цитата:

Сообщение от Aetae (Сообщение 302569)
...если вы найдёте закономерность в конкретной версии браузера - совершенно не факт что в следующей или предыдущей версии всё не по-другому.

Я просто думал, что, не понимая эту закономерность, я упустил что-то важное в теории, недопонял материал, короче.
Но, похоже, Вы правы. Спасибо :thanks:

BallsShaped 14.03.2014 18:33

Цитата:

Сообщение от Boolean_Type
А по-другому в процессе обучения никак

console.log

Boolean_Type 14.03.2014 18:47

Цитата:

Сообщение от BallsShaped (Сообщение 302574)
console.log

Не-не-не, я имел ввиду другую часть цитаты Aetae, см. выше :)
А если и говорить о console.log, то он бы данной проблемы не создал.


Часовой пояс GMT +3, время: 02:29.