Как стать автором
Обновить

Комментарии 20

09.06.2008 эта статья неплохо разбежалась по интернетам. Пруф
И где картинки? Хоть бы ссылки вставили.
Спасибо.
Можно немного дополнить Резига, указав, что при работе с интервалами при блокировке кода методами alert(), prompt(), confirm() в работе браузеров наблюдаются отличия:

setInterval(function(){
	alert(1);
},2000)

Получив сообщение через 2 секунды, подождите примерно еще 2 секунды, а затем закройте сообщение. Firefox 10, IE9, Opera 12 мгновенно показывают новое сообщение. Вебкитовские Chrome и Safari ожидают 2 секунды после закрытия, т.е. в них отсчёт интервала запускается только после того, как завершится текущая функция по интервалу. Это неважно в повседневном коде, но может оказаться важным при специализированно разработке (например, очереди ядра).
Это только с функциями alert/prompt/confirm? То есть в вебките эти функции приостанавливают работу локального времени внутри страницы? Или суть в поведении setInterval'а? В вебките происходит перезапуск таймера после коллбэка, а в фф/ие/о перед коллбэком?
Запустите код — и всё поймёте сами.
Про 10мс это, вообще то, platform depended. Собственно, в windows, setTimeout и setInterval, скорее всего, напрямую используют winApi SetTimer, по крайней мере, описание работы setInterval это дословная калька с доки по SetTimer. Отсюда и все особенности их работы.
Они не используют SetTimer.
www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout — спецификация HTML5 говорит нам о 4мс. Собственно все браузеры и будут на сие ориентированны.

+ developer.mozilla.org/en/DOM/window.setTimeout — здесь еще говорится о том, что вложенные таймеры будут равны 10мс (если я правильно понял суть), но в спецификации я этого не нашел.
Еще от активной вкладки зависит, это надо тоже брать в учет, вешая какие-то фоновые каллбеки в своих веб-приложениях.
Эх и почему обычные, системные, таймеры не работают также чётко, а подвержены косякам allertable состояний :(
Хороший перевод, но ничего нового. Все это есть на русском на javascript.ru
НЛО прилетело и опубликовало эту надпись здесь
В принципе. Поведение схоже с поведением V8, так как он в самом сердце ноды, Функция process.nextTick по сути setTimeout с минимальной задержкой, т.е. как только текущая очередь выполнения освободится наступает новый «tick», событие запускается. Поразвлекайтесь с setTimeout() с задержкой в 1 мс и process.nextTick. Разница лишь в том, что nextTick будет вызваться раньше.

Запустите

setTimeout(function(){
  console.log('Hello timeout');
}, 1);


process.nextTick(function(){
  console.log('Hello ticks');
})


на выходе получите:
Hello ticks
Hello timeout
Дополню для полного понимания process.nextTick добавляет вызов в самое начало очереди.
Проще представить очереди в виде книги: где каждая страница это блок синхронных вызовов. process.nextTick добавляет вызовы в начало следующей страницы:

process.nextTick(function(){
  console.log('Page 2. Tick #1');
})

process.nextTick(function(){
  console.log('Page 2. Tick #2');
})

setTimeout(function(){ console.log('Page 2. Timeout'); }, 1);

console.log('Page 1');


На выходе:
Page 1
Page 2. Tick #1
Page 2. Tick #2
Page 2. Timeout

Претензии?
А можно сделать время в setInterval меньше 1 мсек?
Писал дроби, но любая дробь ведет себя как единица
Я честно сразу вам не скажу полно, но стоит покопать в сторону Event Loop, который наверное все же не может обеспечить вам 1мс)
Точнее сказать, это может варьироваться от ~1мс до ~15мс
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории