Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.03.2014, 01:32
Аспирант
Отправить личное сообщение для Boolean_Type Посмотреть профиль Найти все сообщения от Boolean_Type
 
Регистрация: 02.02.2014
Сообщений: 48

Очередь и наложение вызовов в 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>
Ответить с цитированием
  #2 (permalink)  
Старый 13.03.2014, 16:54
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от Boolean_Type
я подумал, что, раз alert с числом активен, то соответствующая ф-ция уже вроде как стоит в очереди
Никакой "очереди" как таковой нет. Это разные потоки, у них свой "таймер" и своя "жизнь".

Но потоки таки влияют друг на друга и могут частично "сбивать" таймер друг у друга.
Т.е. точного "отстчета" по времени исполнения не жди. Оно только стремиться к идиалу и не более того...
Ответить с цитированием
  #3 (permalink)  
Старый 13.03.2014, 17:12
Аспирант
Отправить личное сообщение для NeoN Посмотреть профиль Найти все сообщения от NeoN
 
Регистрация: 01.03.2013
Сообщений: 77

думаю тут от браузера еще зависит
запусти этот код в опере (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);
Ответить с цитированием
  #4 (permalink)  
Старый 13.03.2014, 19:41
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

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

Основной цикл в Javascript : http://habrahabr.ru/company/tradingview/blog/178261/
Ответить с цитированием
  #5 (permalink)  
Старый 14.03.2014, 17:11
Аспирант
Отправить личное сообщение для Boolean_Type Посмотреть профиль Найти все сообщения от Boolean_Type
 
Регистрация: 02.02.2014
Сообщений: 48

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

После 9-и сек ожидания жму "ОК". ТУТ ЖЕ вылазит 'test' и затем (ТУТ ЖЕ) - "1". Очевидно, что эти срабатывания были в очереди, причём ОБА (т.е., в очереди стояли срабатывания ОБОИХ таймеров). Вопрос лишь в том, почему именно такая последовательность ('test' -> "1"), а не наоборот.
Ответить с цитированием
  #6 (permalink)  
Старый 14.03.2014, 17:26
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,493

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

Последний раз редактировалось Aetae, 14.03.2014 в 17:29.
Ответить с цитированием
  #7 (permalink)  
Старый 14.03.2014, 18:03
Аспирант
Отправить личное сообщение для Boolean_Type Посмотреть профиль Найти все сообщения от Boolean_Type
 
Регистрация: 02.02.2014
Сообщений: 48

Сообщение от Aetae Посмотреть сообщение
... и не ебите мозги...
А по-другому в процессе обучения никак Для меня, во всяком случае.

Сообщение от Aetae Посмотреть сообщение
...если вы найдёте закономерность в конкретной версии браузера - совершенно не факт что в следующей или предыдущей версии всё не по-другому.
Я просто думал, что, не понимая эту закономерность, я упустил что-то важное в теории, недопонял материал, короче.
Но, похоже, Вы правы. Спасибо

Последний раз редактировалось Boolean_Type, 14.03.2014 в 18:22.
Ответить с цитированием
  #8 (permalink)  
Старый 14.03.2014, 18:33
Профессор
Отправить личное сообщение для BallsShaped Посмотреть профиль Найти все сообщения от BallsShaped
 
Регистрация: 14.09.2012
Сообщений: 162

Сообщение от Boolean_Type
А по-другому в процессе обучения никак
console.log
Ответить с цитированием
  #9 (permalink)  
Старый 14.03.2014, 18:47
Аспирант
Отправить личное сообщение для Boolean_Type Посмотреть профиль Найти все сообщения от Boolean_Type
 
Регистрация: 02.02.2014
Сообщений: 48

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Предложение представить код с setInterval для n - но более двух DOM-єлементов JavaScriptProgrammer Events/DOM/Window 1 09.11.2012 08:09
setInterval и глобальные переменные Почемучкин Events/DOM/Window 11 11.08.2012 14:44
Очередь XML запросов Евгений М AJAX и COMET 4 01.02.2012 11:05
setTimeout setInterval и др. mycoding Общие вопросы Javascript 6 28.10.2010 17:26
Проблема в document.write при использовании setInterval() GOll Общие вопросы Javascript 21 06.10.2008 17:38